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') # Linux 示例,先确认本机 socket 路径
handler.setFormatter(logging.Formatter('myapp[%(process)d]: %(levelname)s %(message)s'))
logger.addHandler(handler)
logger.info('应用启动完成')
logger.error('出错了')
日志去向由接收端规则决定,可能是 journal、/var/log/syslog 或 /var/log/messages,可用 logger 命令行验证。
远程 syslog 服务器
handler = SysLogHandler(address=('logserver.internal', 514))
默认 UDP;可设置 socktype=socket.SOCK_STREAM 使用 TCP,但需 import socket 并匹配接收端 framing;TCP 不自动提供 TLS 或持久投递保证。
常见问题(FAQ)
Q:报 "No such file or directory"? /dev/log 不存在——系统没跑 syslog 服务,装 rsyslog 或改用 UDP 地址。
Q:facility 能指定吗? 能,SysLogHandler(facility=SysLogHandler.LOG_LOCAL0)。