如何在Python中配置日志到syslog?

156 投票
12 回答
204655 浏览
提问于 2025-04-16 05:44

我对Python的logging模块有点搞不懂。我的需求很简单:我只想把所有的日志记录到系统日志(syslog)里。看完文档后,我写了这个简单的测试脚本:

import logging
import logging.handlers

my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

handler = logging.handlers.SysLogHandler()

my_logger.addHandler(handler)

my_logger.debug('this is debug')
my_logger.critical('this is critical')

但是这个脚本没有在系统日志里生成任何日志记录。到底哪里出了问题呢?

12 个回答

31

你应该始终使用本地计算机来记录日志,不管是通过/dev/log还是通过TCP连接到localhost。这样可以让符合RFC标准并且功能强大的系统日志守护进程来处理syslog。这就不需要依赖远程守护进程的正常运行,同时也能利用像rsyslog和syslog-ng这样的日志守护进程提供的更多功能。对于SMTP也是一样。直接交给本地的SMTP软件处理。在这种情况下,使用“程序模式”,而不是守护进程,但思路是一样的。让更强大的软件来处理这些事情。重试、排队、本地缓存、使用TCP而不是UDP来处理syslog等等,这些都变得可能。你还可以将这些守护进程的配置和你的代码分开,这样做是合理的。

把你的编码留给你的应用程序,让其他软件协同工作,完成各自的任务。

35

我发现syslog模块可以很简单地实现你所描述的基本日志记录功能:

import syslog
syslog.syslog("This is a test message")
syslog.syslog(syslog.LOG_INFO, "Test message at INFO priority")

当然你还可以做其他事情,但我理解的意思是,就算只用前两行代码,也能满足你的需求。

168

把这一行改成这样:

handler = SysLogHandler(address='/dev/log')

这样对我有效

import logging
import logging.handlers

my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

handler = logging.handlers.SysLogHandler(address = '/dev/log')

my_logger.addHandler(handler)

my_logger.debug('this is debug')
my_logger.critical('this is critical')

撰写回答