fix: 对齐技术架构补齐传输 mTLS 与结构化 JSON 日志(NFR 9 章)
架构核对发现 2 处差距,本次补齐: - Kafka 上行支持 SSL/SASL_SSL 双向 mTLS(8.2 服务间 mTLS 边缘网关↔总线) - 网关日志支持结构化 JSON 输出(NFR 可维护:统一日志规范) - 配置示例与 README 验收口径同步更新
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user