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 - 发送多行而不是一行的主要内容,如果未能解决你的问题,请参考以下文章