我遇到了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
你可以看到第一次测试显示一次,第二次测试显示一次,第三次测试显示第四次,第四次测试显示四次。
我对发生的事情感到困惑?
答案 0 :(得分:0)
当您调用logger = logging.getLogger()
时,您会获得对logging
模块中某处存储的同一记录器对象的引用(id(logger)
每次都相同)。调用log_something_to_syslog()
会将新处理程序(独立于所有其他附加处理程序的工作)添加到同一记录程序中。您只应在程序的初始化阶段设置一次处理程序。所以你应该拆分这个功能。
来自文档: https://docs.python.org/2/library/logging.html#logging.getLogger
logging.getLogger([名称])
对具有给定名称的此函数的所有调用都返回相同的记录器 实例。这意味着永远不需要传递记录器实例 在应用程序的不同部分之间。