Python syslog库如何为日志添加自定义tag与facility字符串
Python syslog模块自定义tag与facility实现方案
先说明底层机制限制:
POSIX标准原生syslog接口的facility字段是固定整数枚举值,本身就不支持传入自定义字符串;Python标准库syslog是对C语言syslog接口的薄封装,没有提供额外的自定义参数。你要的调用效果可以通过以下两种方式实现:
方案1:用原生接口实现等效效果(无第三方依赖)
syslog.openlog的第一个位置参数ident就是你需要的tag字段,只是大部分示例代码省略了这个参数。自定义字符串facility可以通过「日志内容前缀+本地syslog规则配置」实现完全等效的功能:
import syslog # 第一个位置参数传入tag值,facility选预设的LOG_USER通用分类即可 syslog.openlog("mytag", logoption=syslog.LOG_PID, facility=syslog.LOG_USER) # 自定义的facility标识直接放在日志内容开头 syslog.syslog('myapp: myapp processing initiated...')
这个方案输出的日志会自动携带mytag作为进程标识,和原生tag效果完全一致。你只要在本地rsyslog/syslog-ng配置里加一条匹配规则,把带myapp:前缀的日志单独归类存储、转发,和自定义facility的实际使用效果没有区别。
方案2:简单封装实现你示例的调用写法
如果要完全匹配你给出的调用格式,不用装第三方包,简单封装下原生接口就行:
import syslog _custom_facility = "" def openlog(logoption, facility, tag): global _custom_facility _custom_facility = facility # 调用原生接口设置tag syslog.openlog(tag, logoption=logoption, facility=syslog.LOG_USER) def syslog(msg): # 输出日志时自动拼接自定义facility前缀 syslog.syslog(f"{_custom_facility}: {msg}") # 可以直接用你期望的调用方式 openlog(logoption=syslog.LOG_PID, facility="myapp", tag="mytag") syslog('myapp processing initiated...')
补充说明
如果需要向远程syslog服务发送携带自定义字符串facility的日志,标准库syslog模块做不到,因为它严格遵循POSIX报文格式约束,这种场景建议用标准库logging模块的SysLogHandler,自行构造结构化日志报文携带自定义字段即可。
内容的提问来源于stack exchange,提问作者dmx
相关产品推荐
相关产品推荐

