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

python-logging模块-handlers.SysLogHandler-发送多行而不是一行,python,unix,syslog,Python,Unix,Syslog,我在python日志模块方面遇到问题。这是在Solaris服务器和MacOSX桌面上使用python 2.7。我可以在两台计算机上重新创建这个问题,可能是syslog服务器处理信息的方式出了问题,或者我的代码中有一个bug(我在想什么) 当我向远程syslog服务器发送消息时,它似乎多次发送该消息,下面更容易显示问题: 我正在使用的Python函数: def log_something_to_syslog(thing_to_log): logger = logging.getLogger

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

当我向远程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
正如您所看到的,第一次测试显示一次,第二次显示两次,第三次显示三次,第四次显示四次


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

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

从文档中:

logging.getLogger([名称])

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