为什么Python的SysLogHandler需要一个地址?

时间:2015-07-18 03:32:34

标签: python logging python-3.4 syslog

此代码使用syslog模块记录到syslog:

import syslog

syslog.syslog(syslog.LOG_ERR, 'a')

这是使用logging模块的等效代码:

import logging
from logging.handlers import SysLogHandler

logger = logging.getLogger()
logger.addHandler(SysLogHandler(address='/dev/log'))
logger.setLevel(logging.ERROR)
logger.error('a')

如果我在第二个代码段中遗漏了address参数,则它不会执行任何操作。为什么logging版本要求我指定地址,syslog模块可以自行解决?

我宁愿不必指定这条路径,因为它依赖于平台。我是否必须编写自己的SysLogHandler版本,该版本委托给syslog模块?

2 个答案:

答案 0 :(得分:0)

来自文档:

Note that if your server is not listening on UDP port 514, SysLogHandler may appear not to work.

您是否确认您的系统日志正在侦听SysLogHandler使用的默认端口(514)?如果它们不相同,那么您需要提供要使用的日志的特定端口号或路径。

请参阅:https://docs.python.org/2/library/logging.handlers.html#sysloghandler

答案 1 :(得分:0)

syslog.syslog API允许您仅将事件发送到本地计算机上的系统记录器,而通过在Python日志记录中指定地址,您不仅可以记录到本地计算机,还可以记录远程{{1}服务器。因此,日志记录方法涵盖的范围比syslog更广泛。另请注意,在某些平台/某些环境中,syslog.syslog并不总是线程安全的(过去),因为底层系统调用API在这些环境中不是线程安全的。这可能不再是这种情况,但最好检查平台上syslog.syslog的文档。有关更多背景信息,请参阅this Python issue

此外,您也可以使用日志记录API从Windows计算机登录syslog服务器(Windows上没有syslog模块)。