Python 如何写日志到 syslog(SysLogHandler 用法)?
Python 写 syslog 用 logging.handlers.SysLogHandler:指定 /dev/log(Linux)或 UDP 514(远程),配合 formatter 输出标准格式。本文给出本机与远程两种配置及 macOS/Linux 差异。
标准库自带方案:logging.handlers.SysLogHandler——本机用 address='/dev/log'(macOS 是 /var/run/syslog),远程 syslog 服务器用 address=('host', 514) 走 UDP。
本机 syslog
import logging
from logging.handlers import SysLogHandler
logger = logging.getLogger('myapp')
logger.setLevel(logging.INFO)
handler = SysLogHandler(address='/dev/log') # macOS 用 /var/run/syslog
handler.setFormatter(logging.Formatter('myapp[%(process)d]: %(levelname)s %(message)s'))
logger.addHandler(handler)
logger.info('应用启动完成')
logger.error('出错了')
日志出现在 /var/log/syslog(Ubuntu)或 /var/log/messages(RHEL),可用 logger 命令行验证。
远程 syslog 服务器
handler = SysLogHandler(address=('logserver.internal', 514))
默认 UDP;需要可靠性选 TCP(SysLogHandler 的 socktype=socket.SOCK_STREAM)。
观测云对照
写到 syslog 的日志可由观测云 DataKit 的 syslog 采集器统一接收上报;应用也可以直接用 DataKit 的日志 HTTP 写入接口跳过 syslog 层。
常见问题(FAQ)
Q:报 "No such file or directory"? /dev/log 不存在——系统没跑 syslog 服务,装 rsyslog 或改用 UDP 地址。
Q:facility 能指定吗? 能,SysLogHandler(facility=SysLogHandler.LOG_LOCAL0)。