fix: 对齐技术架构补齐传输 mTLS 与结构化 JSON 日志(NFR 9 章)

架构核对发现 2 处差距,本次补齐:
- Kafka 上行支持 SSL/SASL_SSL 双向 mTLS(8.2 服务间 mTLS 边缘网关↔总线)
- 网关日志支持结构化 JSON 输出(NFR 可维护:统一日志规范)
- 配置示例与 README 验收口径同步更新
This commit is contained in:
2026-08-04 15:46:09 +08:00
parent f49c0920d4
commit 098125164d
8 changed files with 481 additions and 7 deletions
+29 -5
View File
@@ -35,6 +35,8 @@ def parse_args(argv: List[str]) -> argparse.Namespace:
parser.add_argument("--rounds", type=int, default=0,
help="采集轮数上限(0=无限,调试用)")
parser.add_argument("--verbose", action="store_true", help="输出调试日志")
parser.add_argument("--log-json", action="store_true",
help="结构化 JSON 日志(NFR 9 章统一日志规范;生产模式建议开启)")
return parser.parse_args(argv)
@@ -78,7 +80,7 @@ def build_engine(config: dict, point_dict: PointDict):
def build_sink(config: dict, spool) -> object:
"""按模板配置组装 Kafka 上行通道。"""
"""按模板配置组装 Kafka 上行通道(含 mTLS 传输安全,NFR 9 章)。"""
from upstream import KafkaSink
kafka_cfg = config.get("kafka", {})
@@ -87,15 +89,37 @@ def build_sink(config: dict, spool) -> object:
topic_prefix=kafka_cfg.get("topic_prefix", "iaop"),
spool=spool,
batch_size=int(kafka_cfg.get("batch_size", 500)),
security=kafka_cfg.get("security") or {},
)
def main(argv: List[str]) -> int:
args = parse_args(argv)
logging.basicConfig(
level=logging.DEBUG if args.verbose else logging.INFO,
format="%(asctime)s %(levelname)s %(name)s: %(message)s",
)
if args.log_json:
# NFR 9 章「可维护」:统一日志规范 —— 结构化 JSON,便于采集到统一日志平台
import json as _json
class JsonFormatter(logging.Formatter):
def format(self, record):
payload = {
"ts": self.formatTime(record, "%Y-%m-%dT%H:%M:%S%z"),
"level": record.levelname,
"logger": record.name,
"msg": record.getMessage(),
}
if record.exc_info:
payload["exc"] = self.formatException(record.exc_info)
return _json.dumps(payload, ensure_ascii=False)
handler = logging.StreamHandler()
handler.setFormatter(JsonFormatter())
logging.basicConfig(level=logging.DEBUG if args.verbose else logging.INFO, handlers=[handler])
else:
logging.basicConfig(
level=logging.DEBUG if args.verbose else logging.INFO,
format="%(asctime)s %(levelname)s %(name)s: %(message)s",
)
# 1) 加载模板配置
with open(args.config, "r", encoding="utf-8") as fh: