You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为所有uWSGI日志(含HARAKIRI)实现统一结构化记录?

uWSGI全日志结构化配置方案(解决HARAKIRI日志未采集&应用日志双重封装问题)

问题场景

可观测性平台要求日志必须包含服务元数据的JSON结构化格式才能被采集归类。当前已完成uWSGI请求日志的结构化配置:

<req-logger>app syslog:uwsgi-req</req-logger>
    <log-req-encoder>json {"service":"foo","message":"${msg}"}</log-req-encoder>
    <log-req-encoder>nl</log-req-encoder>

但HARAKIRI(worker超时终止)等非请求类系统日志未被结构化,无法被采集;尝试通过全局log-encoder配置处理这类日志时,又导致应用已输出的JSON日志被双重封装,出现类似{"service":"foo","msg":"{\"service\":\"foo\",\"msg\":\"application log\"}"}的嵌套问题。

需要实现所有uWSGI日志统一采用请求日志的JSON结构,同时避免重复封装。

可行解决方案

方案1:基于日志格式的路由规则区分处理

利用uWSGI的log-route功能,通过正则匹配区分已JSON化的应用日志和未结构化的系统日志,仅对后者应用封装:

<!-- 保留原有请求日志配置 -->
<req-logger>app syslog:uwsgi-req</req-logger>
<log-req-encoder>json {"service":"foo","message":"${msg}"}</log-req-encoder>
<log-req-encoder>nl</log-req-encoder>

<!-- 主日志处理:区分非JSON格式的系统日志 -->
<logger>main syslog:uwsgi-main</logger>
<!-- 路由规则:匹配不以{开头的日志(排除已结构化的应用日志) -->
<log-route>non-json !^\{</log-route>
<!-- 仅对非JSON日志应用结构化封装 -->
<log-encoder:non-json>json {"service":"foo","message":"${msg}"}</log-encoder:non-json>
<log-encoder:non-json>nl</log-encoder:non-json>
<!-- 已JSON化的应用日志直接透传 -->
<log-encoder>nl</log-encoder>

原理:通过!^\{正则过滤出未JSON化的系统日志(如HARAKIRI日志),仅对这类日志添加服务元数据;应用输出的JSON日志直接跳过封装,避免双重嵌套。

方案2:启用log-master统一管理日志

开启uWSGI的log-master让主进程接管所有日志输出,结合路由规则实现统一处理:

<!-- 启用日志主进程统一管控 -->
<log-master>true</log-master>

<!-- 路由规则:匹配非JSON格式日志 -->
<log-route>non-json !^\{</log-route>
<!-- 非JSON日志应用结构化封装 -->
<log-encoder:non-json>json {"service":"foo","message":"${msg}"}</log-encoder:non-json>
<log-encoder:non-json>nl</log-encoder:non-json>
<!-- JSON日志直接输出 -->
<log-encoder>nl</log-encoder>

注意:需确保uWSGI版本在2.0及以上,支持log-route功能。

方案3:通过应用日志标识字段过滤

若可修改应用日志格式,可添加专属标识字段(如"source": "app"),在uWSGI中识别并透传:

  1. 应用日志输出示例:
{"source": "app", "service": "foo", "message": "应用业务日志内容"}
  1. uWSGI配置:
<!-- 请求日志配置保持不变 -->
<req-logger>app syslog:uwsgi-req</req-logger>
<log-req-encoder>json {"service":"foo","message":"${msg}"}</log-req-encoder>
<log-req-encoder>nl</log-req-encoder>

<!-- 路由规则:匹配包含应用标识的日志,直接透传 -->
<log-route>app-log "\"source\": \"app\""</log-route>
<log-encoder:app-log>nl</log-encoder:app-log>
<!-- 其他日志应用结构化封装 -->
<log-encoder>json {"service":"foo","message":"${msg}"}</log-encoder>
<log-encoder>nl</log-encoder>

关键验证点

  • 测试时可先将日志输出到本地文件,确认格式符合要求后再切换到syslog
  • 根据实际日志格式调整正则匹配规则,确保过滤逻辑准确

内容的提问来源于stack exchange,提问作者OscarVanL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:17:40