syslog.syslog 与 SysLogHandler

Posted

技术标签:

【中文标题】syslog.syslog 与 SysLogHandler【英文标题】:syslog.syslog vs SysLogHandler 【发布时间】:2012-12-27 05:59:17 【问题描述】:

我正在研究如何从我的 Python 应用程序中登录到 syslog,我发现有两种方法:

    使用syslog.syslog() 例程 使用记录器模块SysLogHandler

哪个是最好的选择,每个的优点/缺点等等,因为我真的不知道我应该使用哪个。

【问题讨论】:

请考虑这篇博文...我相信它提供了许多有价值的见解和 POV。 aminus.org/blogs/index.php/2008/07/03/… @David 这是一篇很老的帖子;它仍然相关吗? 【参考方案1】:

syslog.syslog() 只能用于向本地 syslogd 发送消息。 SysLogHandler 可以用作全面的、可配置的日志子系统的一部分,并且可以记录到远程机器。

【讨论】:

嗯,这并不完全正确,您可以配置您的系统日志以将其接收到的内容也发送到远程系统日志服务器。这样做的好处是,不仅python应用程序的消息被发送到远程服务器,而且系统的每一条消息。 但是该配置是独立于 Python 程序完成的。我的答案仍然有效。 是的,但我的意思是,使用 syslog.syslog() 您还可以通过本地 syslog 服务器将消息发送到远程 syslog 服务器,因此 SysLogHandler 与 syslog 相比并不是一个优势.syslog() 我和 Juancho 在一起:我正在设置一个 RPi 来进行实时传感,我希望发送 所有 系统消息(不仅仅是 Python 的消息)到远程日志服务。所以在这种情况下使用syslog.syslog() 并配置syslog 服务最终会更加全面。【参考方案2】:

日志记录模块是一个更全面的解决方案,可以潜在地处理您的所有日志消息,并且非常灵活。例如,您可以为您的记录器设置多个处理程序,并且每个处理程序都可以设置为在不同级别进行记录。您可以使用 SysLogHandler 将错误发送到 syslog、FileHandler 用于调试日志,以及 SMTPHandler 将真正关键的消息通过电子邮件发送给操作员。您还可以在模块中定义记录器的层次结构,每个记录器都有自己的级别,因此您可以启用/禁用来自特定模块的消息,例如:

import logging
logger = logging.getLogger('package.stable_module')
logger.setLevel(logging.WARNING)

在另一个模块中:

import logging
logger = logging.getLogger('package.buggy_module')
logger.setLevel(logging.DEBUG)

这两个模块中的日志消息将根据级别发送到“包”记录器,并最终发送到您定义的处理程序。您还可以将处理程序直接添加到模块记录器,等等。如果您已经了解了这么多并且仍然感兴趣,那么我建议您跳转到日志记录 tutorial 了解更多详细信息。

【讨论】:

【参考方案3】:

到目前为止,logging.handlers.SysLogHander 有一个缺点尚未提及。那就是我无法设置LOG_ODELAYLOG_NOWAITLOG_PID 之类的选项。另一方面,LOG_CONSLOG_PERROR 可以通过添加更多处理程序来实现,并且默认情况下已经设置了LOG_NDELAY,因为在实例化处理程序时连接打开。

【讨论】:

以上是关于syslog.syslog 与 SysLogHandler的主要内容,如果未能解决你的问题,请参考以下文章

linux下syslog-ng日志集中管理服务部署记录

如何在 syslog4j syslog 服务器中解析 syslog 消息

Syslog-ng日志系统

简单搭建syslog-ng server记录log

python之syslog模块

记录到多个 syslog 服务器 - log4j