2015-06-09 2 views
2

У меня возникают проблемы с модулем регистрации python. Это использует python 2.7 на сервере Solaris и настольном компьютере MAC OSX. Я могу воссоздать проблему на обоих компьютерах, возможно, возможно, что сервер syslog обрабатывает информацию или у меня есть ошибка в моем коде (что я думаю).python - logging module - handlers.SysLogHandler - отправка нескольких строк вместо одного

Когда я отправить сообщение на удаленный сервер системного журнала он, кажется, отправляя сообщение несколько раз, его легче показать проблему ниже: функции

питона Я использую:

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") 

Вот мой выход с сервера системного журнала:

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

Когда вы вызываете logger = logging.getLogger(), вы получаете ссылку на тот же объект регистрации, который хранится где-то в модуле logging (id(logger) будет одинаковым каждый раз). Вызов log_something_to_syslog() добавляет новый обработчик (который выполняет свою работу независимо от всех других прикрепленных обработчиков) к тому же журналу. Вы должны установить обработчики только на этапе инициализации своей программы. Поэтому вы должны разделить эту функцию.

Из документов: https://docs.python.org/2/library/logging.html#logging.getLogger

logging.getLogger ([имя])

Всех вызовов этой функции с заданным именем возвращает тот же экземпляр регистратора . Это означает, что экземпляры регистратора никогда не должны передаваться между различными частями приложения.

Смежные вопросы