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

Why does Python's SysLogHandler require an address?

此代码使用 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 模块?

来自文档:

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

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

此外,您也可以使用日志 API 从 Windows 机器登录到 syslog 服务器(syslog 模块在 Windows).