2012-02-29 119 views
4

我有一个Python日志记录模块的问题,我不确定我是否在这里做一些愚蠢的事情,但我有两个Python脚本,一个(master.py)调用另一个(slave)。 PY)。他们都记录到单独的日志文件,但被调用的第二个脚本(slave.py)似乎递归地记录!Python日志多个文件

任何人都可以看到我在做什么错在这里?

这里是我的代码:

# 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是一个全局对象,你每次在runMain()中调用addHandler() – pkit 2012-02-29 13:40:34

+0

谢谢,我已经使用了:“if not len(slaveLog.handlers):”在添加fileHandler之前。我错误地认为记录模块不会多次添加相同的fileHandler。 – Jak 2012-02-29 15:19:56

回答

5

logging.getLogger([name])总是返回相同的对象(全局对象),你每次调用runMain时间打电话addHandler操作就可以了。

+0

感谢您的回复:-)我认为记录模块不会添加已经存在的处理程序?因为每次调用它时都会使用相同的[名称],所以我不明白为什么它会一直添加另一个处理程序。我甚至可以运行removeHandler()函数,但它不会删除任何内容。 – Jak 2012-02-29 14:47:29

+2

正如pkit所说,你做错了。您应该只在一个地方配置日志记录(添加处理程序,设置级别等)。看到这篇文章:http://eric.themoritzfamily.com/learning-python-logging.html – 2012-02-29 15:18:04

+0

谢谢我现在拥有它:-) slave.py有时会被自己调用为脚本,所以在这种情况下,我需要在slave.py中配置日志记录。但slave.py也会被master.py多次调用,在这种情况下,日志记录已经配置好了,因此slave.py会多次添加相同的fileHandler,从而导致错误。 – Jak 2012-02-29 15:27:06

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 

我想你最好在主函数中配置日志格式。