如何将logger日志发送至Seq并解决自定义日志格式不生效问题
问题原因
seqlog 库默认采用结构化上报逻辑,会将日志的各字段(如日志级别、request_id、文件名等)单独作为属性上报给 Seq,不会主动应用你配置的日志格式化字符串——你之前设置的格式仅作用于控制台流输出的 Handler,未同步到 Seq 对应的 Handler 上。
解决方案
方案1:客户端指定Seq Handler的格式化器(推荐,一次配置全量生效)
在调用 seqlog.log_to_seq() 时,传入你自定义的 Formatter 实例即可,完整代码如下:
import logging import seqlog # 注意:这里不需要加f前缀,%开头的是logging模块的内置占位符 _log_format = "%(asctime)s - [%(levelname)s] - request_id=%(request_id)s - %(name)s - (%(filename)s).%(funcName)s(%(lineno)d) - %(message)s" # 实例化自定义格式化器 custom_formatter = logging.Formatter(_log_format) seqlog.log_to_seq( server_url="http://localhost:5341/", api_key="My API Key", level=logging.INFO, batch_size=10, auto_flush_timeout=10, override_root_logger=True, formatter=custom_formatter, # 新增此行,指定Seq上报使用的格式化器 )
配置完成后 Seq 中存储的消息内容就会和控制台输出的格式完全一致,同时各结构化字段依然会作为独立属性保存在 Seq 中,不影响后续筛选查询。
方案2:Seq服务端修改全局显示模板
如果不需要客户端统一控制格式,也可以直接在 Seq 后台的「设置」-「默认消息模板」中,配置你需要的显示格式,示例如下:{@Timestamp:yyyy-MM-dd HH:mm:ss,fff} - [{@Level}] - request_id={request_id} - {Logger} - ({Filename}).{MemberName}({LineNumber}) - {@Message}
这种方式不需要修改代码,仅调整服务端显示逻辑即可。
内容的提问来源于stack exchange,提问作者SergeyS
相关产品推荐
相关产品推荐

