python - logging module - handlers.SysLogHandler - 发送多行而不是一行

时间:2015-06-09 18:42:22

标签: python unix syslog

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

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

我正在使用的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 个答案:

答案 0 :(得分:0)

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

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

  

logging.getLogger([名称])

     

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