syslog.syslog与SysLogHandler的区别

21

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

  1. 使用syslog.syslog()例程
  2. 使用日志记录器模块SysLogHandler

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


1
请考虑阅读这篇博客文章……我相信它提供了许多有价值的见解和观点。 http://www.aminus.org/blogs/index.php/2008/07/03/writing-high-efficiency-large-python-sys-1?blog=2 - user3494924
@David 那是一个非常古老的帖子,它仍然相关吗? - tshepang
3个回答

11

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


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

5
日志模块是一种更全面的解决方案,可以潜力处理所有日志消息,并且非常灵活。例如,您可以为记录器设置多个处理程序,并且每个处理程序都可以设置为不同级别进行记录。您可以使用SysLogHandler将错误发送到syslog,使用FileHandler进行调试日志记录,使用SMTPHandler将真正关键的消息发送到ops的电子邮件中。您还可以在模块内定义日志记录器的层次结构,每个日志记录器都有其自己的级别,因此您可以启用/禁用特定模块的消息。
import logging
logger = logging.getLogger('package.stable_module')
logger.setLevel(logging.WARNING)

在另一个模块中:
import logging
logger = logging.getLogger('package.buggy_module')
logger.setLevel(logging.DEBUG)

这两个模块中的日志消息将根据级别发送到“package”记录器,最终发送到您定义的处理程序。您还可以直接向模块记录器添加处理程序,依此类推。如果你一直在跟进并且仍然感兴趣,我建议你跳转到logging教程了解更多细节。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接