2012-02-29 5 views
4

У меня проблема с модулем ведения журнала Python, я не уверен, что я здесь делаю что-то глупое, но у меня есть два сценария Python: один (master.py), который вызывает другой (подчиненный. ру). Они оба регистрируются для разделения файлов журналов, но второй скрипт (slave.py), который вызывается, кажется рекурсивным.Python Logging Несколько файлов

Может ли кто-нибудь увидеть, что я делаю неправильно здесь?

Вот мой код:

# master.py 

import sys 
import logging 
import slave 

masterLog = logging.getLogger('master') 
masterLog.setLevel(logging.DEBUG) 
masterHandler = logging.FileHandler('master.log') 
formatter = logging.Formatter('%(levelname)s: %(asctime)s %(funcName)s(%(lineno)d) -- %(message)s', datefmt = '%Y-%m-%d %H:%M:%S') 
masterHandler.setFormatter(formatter) 
masterLog.addHandler(masterHandler) 
masterLog.info('This is masterLog running on master.py') 
print 'master.py has: ', len(masterLog.handlers), 'handlers' 

for i in range(1,6): 
     masterLog.info('Running slave %s' % i) 
     slave.runMain() 

# slave.py 

import sys 
import logging 

def runMain(): 
    slaveLog = logging.getLogger('slave') 
    slaveLog.setLevel(logging.DEBUG) 
    slaveHandler = logging.FileHandler('slave.log') 
    formatter = logging.Formatter('%(levelname)s: %(asctime)s %(funcName)s(%(lineno)d) -- %(message)s', datefmt = '%Y-%m-%d %H:%M:%S') 
    slaveHandler.setFormatter(formatter) 
    slaveLog.addHandler(slaveHandler) 
    slaveLog.info('This is slaveLog running on slave.py') 
    print 'slave.py has: ', len(slaveLog.handlers), 'handlers' 

if __name__ == '__main__': 
    runMain() 

Вот результат:

master.py has: 1 handlers 
slave.py has: 1 handlers 
slave.py has: 2 handlers 
slave.py has: 3 handlers 
slave.py has: 4 handlers 
slave.py has: 5 handlers 

И master.log:

INFO: 2012-02-29 13:26:49 <module>(13) -- This is masterLog running on master.py 
INFO: 2012-02-29 13:26:49 <module>(17) -- Running slave 1 
INFO: 2012-02-29 13:26:49 <module>(17) -- Running slave 2 
INFO: 2012-02-29 13:26:49 <module>(17) -- Running slave 3 
INFO: 2012-02-29 13:26:49 <module>(17) -- Running slave 4 
INFO: 2012-02-29 13:26:49 <module>(17) -- Running slave 5 

И slave.log:

INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py 

Ведомое сценарий, кажется, добавить новый файл обработчик каждый раз, когда его названием. В файле slave.log должно быть только 5 записей, но каждый раз, когда slave.py вызывается выводом журнала для каждого обработчика файла!

Спасибо, Jak

+0

slaveLog - глобальный объект, и каждый раз вы вызываете addHandler в runMain() – pkit

+0

Спасибо, я работал вокруг него, используя: «if not len ​​(slaveLog.handlers):« перед добавлением fileHandler. Я был под (ошибочным) впечатлением, что модуль регистрации не будет добавлять один и тот же файлHandler несколько раз. – Jak

ответ

5

logging.getLogger([name]) всегда возвращает один и тот же объект (глобальный объект), и вы называете ДобавитьОбработчик на ней каждый раз, когда вы называете runMain.

+0

Спасибо за ваш ответ :-) Я думал, что модуль журнала не добавит уже существующего обработчика? Поскольку его одно и то же [имя] каждый раз, когда он называется, я не понимаю, почему он продолжает добавлять другого обработчика. Я могу даже запустить функцию removeHandler(), но ничего не удаляет. – Jak

+2

Как говорит pkit, вы делаете это неправильно. Вы должны только настраивать ведение журнала (добавлять обработчики, устанавливать уровни и т. Д.) В одном месте. См. Это сообщение: http://eric.themoritzfamily.com/learning-python-logging.html –

+0

Спасибо, что у меня есть это сейчас :-) Slave.py иногда вызывается как сценарий сам по себе, поэтому в этом сценарии мне нужно иметь журнал, настроенный в slave.py. Но slave.py также вызывается master.py несколько раз, и в этом случае ведение журнала уже настроено, и поэтому slave.py добавляет один и тот же файлHandler несколько раз, тем самым выдавая ошибку. – Jak

0
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import logging 
import logging.handlers 
from logging.config import dictConfig 

logger = logging.getLogger(__name__) 

DEFAULT_LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
} 
def configure_logging(logfile_path): 
    """ 
    Initialize logging defaults for Project. 

    :param logfile_path: logfile used to the logfile 
    :type logfile_path: string 

    This function does: 

    - Assign INFO and DEBUG level to logger file handler and console handler 

    """ 
    dictConfig(DEFAULT_LOGGING) 

    default_formatter = logging.Formatter(
     "[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s():%(lineno)s] [PID:%(process)d TID:%(thread)d] %(message)s", 
     "%d/%m/%Y %H:%M:%S") 

    file_handler = logging.handlers.RotatingFileHandler(logfile_path, maxBytes=10485760,backupCount=300, encoding='utf-8') 
    file_handler.setLevel(logging.INFO) 

    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.DEBUG) 

    file_handler.setFormatter(default_formatter) 
    console_handler.setFormatter(default_formatter) 

    logging.root.setLevel(logging.DEBUG) 
    logging.root.addHandler(file_handler) 
    logging.root.addHandler(console_handler) 



[31/10/2015 22:00:33] [DEBUG] [yourmodulename] [yourfunction_name():9] [PID:61314 TID:140735248744448] this is logger infomation from hello module 

Я думаю, что вам лучше настроить формат ведения журнала в основной функции.