|
@@ -53,8 +53,20 @@ def _build_fluent_handler() -> Optional[logging.Handler]:
|
|
|
port=settings.FLUENTD_PORT,
|
|
port=settings.FLUENTD_PORT,
|
|
|
timeout=settings.FLUENTD_TIMEOUT_SEC
|
|
timeout=settings.FLUENTD_TIMEOUT_SEC
|
|
|
)
|
|
)
|
|
|
- # 注意:FluentHandler 不应设置普通字符串 formatter,
|
|
|
|
|
- # 否则发送到 Fluentd 的 record 会退化为 string,导致 record_transformer 报错。
|
|
|
|
|
|
|
+ # 给 Fluentd 输出结构化字段(dict),避免 record 退化为 string。
|
|
|
|
|
+ # 这里不能使用普通 logging.Formatter,否则会变成纯文本。
|
|
|
|
|
+ if hasattr(fluent_handler, "FluentRecordFormatter"):
|
|
|
|
|
+ fh.setFormatter(fluent_handler.FluentRecordFormatter({
|
|
|
|
|
+ "timestamp": "%(asctime)s",
|
|
|
|
|
+ "level": "%(levelname)s",
|
|
|
|
|
+ "logger": "%(name)s",
|
|
|
|
|
+ "message": "%(message)s",
|
|
|
|
|
+ "module": "%(module)s",
|
|
|
|
|
+ "funcName": "%(funcName)s",
|
|
|
|
|
+ "lineNo": "%(lineno)d",
|
|
|
|
|
+ "app": settings.APP_NAME,
|
|
|
|
|
+ "env": settings.APP_ENV
|
|
|
|
|
+ }))
|
|
|
return fh
|
|
return fh
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
logging.getLogger(__name__).error(f"初始化 Fluentd Handler 失败: {e}")
|
|
logging.getLogger(__name__).error(f"初始化 Fluentd Handler 失败: {e}")
|