python - 日志记录模块 - handlers.SysLogHandler - 发送多行而不是一行

Posted

技术标签:

【中文标题】python - 日志记录模块 - handlers.SysLogHandler - 发送多行而不是一行【英文标题】:python - logging module - handlers.SysLogHandler - sending multiple lines instead of one 【发布时间】:2015-06-09 18:42:21 【问题描述】:

我在使用 python 日志记录模块时遇到问题。这是在 Solaris 服务器和 MAC OSX 桌面上使用 python 2.7。我可以在两台计算机上重新创建问题,系统日志服务器处理信息的方式可能有问题,或者我的代码中有错误(我在想什么)。

当我向远程系统日志服务器发送消息时,它似乎多次发送消息,更容易显示以下问题:

我正在使用的 Python 函数:

def log_something_to_syslog(thing_to_log):
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    handler = logging.handlers.SysLogHandler(address=('MYSERVER', 514), socktype=socket.SOCK_DGRAM)
    formatter = logging.Formatter('Test_debug_python: %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logging.info(str(thing_to_log))

我调用了这个函数 4 次,这里是函数调用:

>>> log_something_to_syslog("Hello World Test 1")
>>> log_something_to_syslog("Hello World Test 2")
>>> log_something_to_syslog("Hello World Test 3")
>>> log_something_to_syslog("Hello World Test 4")

这是我从 syslog 服务器的输出:

2015-06-09T14:24:50-04:00 10.134.122.71 Test_debug_python: Hello World Test 1
2015-06-09T14:25:06-04:00 10.134.122.71 Test_debug_python: Hello World Test 2
2015-06-09T14:25:06-04:00 10.134.122.71 Test_debug_python: Hello World Test 2
2015-06-09T14:25:16-04:00 10.134.122.71 Test_debug_python: Hello World Test 3
2015-06-09T14:25:16-04:00 10.134.122.71 Test_debug_python: Hello World Test 3
2015-06-09T14:25:16-04:00 10.134.122.71 Test_debug_python: Hello World Test 3
2015-06-09T14:25:18-04:00 10.134.122.71 Test_debug_python: Hello World Test 4
2015-06-09T14:25:18-04:00 10.134.122.71 Test_debug_python: Hello World Test 4
2015-06-09T14:25:18-04:00 10.134.122.71 Test_debug_python: Hello World Test 4
2015-06-09T14:25:18-04:00 10.134.122.71 Test_debug_python: Hello World Test 4

如您所见,第一次测试显示一次,第二次显示两次,第三次显示三次,第四次显示四次。

我对发生了什么感到困惑?

【问题讨论】:

【参考方案1】:

当您调用logger = logging.getLogger() 时,您将获得对存储在logging 模块中某处的相同记录器对象的引用(id(logger) 每次都相同)。调用log_something_to_syslog() 会向同一个记录器添加一个新的处理程序(它的工作独立于所有其他附加的处理程序)。您应该只在程序的初始化阶段设置一次处理程序。所以你应该拆分这个函数。

来自文档: https://docs.python.org/2/library/logging.html#logging.getLogger

logging.getLogger([名称])

使用给定名称对该函数的所有调用都返回相同的记录器 实例。这意味着永远不需要传递记录器实例 应用程序的不同部分之间。

【讨论】:

以上是关于python - 日志记录模块 - handlers.SysLogHandler - 发送多行而不是一行的主要内容,如果未能解决你的问题,请参考以下文章

python常用模块——logger模块

Python模块-logging模块

Python日志模块介绍

python日志之logging模块--理解

python中常用模块详解二

python-25 logging日志模块之二