使用Python日志模块将info信息记录到一个文件,错误信息记录到另一个文件

8
我找到了一些类似的示例,可以将日志消息记录到多个文件中。但并没有完全符合我的要求。我正在使用日志模块,并将所有信息消息记录到控制台和文件中(稍后会关闭控制台日志记录)。但是,我希望将所有信息消息记录到file.log中,将所有错误消息记录到file.err中。如果可能的话,最好将所有消息记录到file.log(错误和信息),然后将所有错误消息记录到单独的文件中。这种情况是否可行?

---------

显然我不能在7小时内回答自己的问题,因此我将更新原始问题。

---------

我现在感觉很愚蠢。在发布之前,我尝试了几个小时的示例,然后又发现了这个“问题”。 就好像打出我想做的事情的任务,在阅读示例时触发了某些东西。

http://docs.python.org/2/howto/logging-cookbook.html

这将把所有INFO级别及以上的内容输出到一个日志文件(log_file),并将logging.error和logging.warning消息打印到另一个文件(err_file)中。
# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.INFO,
                   format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                   filemode='w')

log_error = logging.FileHandler(err_file)
log_error.setLevel(logging.WARNING)

log_info = logging.FileHandler(log_file)
log_info.setLevel(logging.INFO)

# set a format which is simpler for console use
formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s')    

# tell the handler to use this format
log_error.setFormatter(formatter)    
log_info.setFormatter(formatter)        

# add the handler to the root logger
logging.getLogger('').addHandler(log_info)
logging.getLogger('').addHandler(log_error)

你可以分享一些你的代码吗? - yuvi
那接下来呢?你有什么解决方案建议吗?请在下面写出来作为答案。如果您要对我们的问题进行一些补充,请解释我们代码的重要性,因为我不太明白你想要什么... - Kartoch
问题是有效的,但是OP已经在问题中解决了它。 - Praveen
2个回答

13

test_log.py:

import logging

def get_logger(    
        LOG_FORMAT     = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
        LOG_NAME       = '',
        LOG_FILE_INFO  = 'file.log',
        LOG_FILE_ERROR = 'file.err'):

    log           = logging.getLogger(LOG_NAME)
    log_formatter = logging.Formatter(LOG_FORMAT)

    # comment this to suppress console output
    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(log_formatter)
    log.addHandler(stream_handler)

    file_handler_info = logging.FileHandler(LOG_FILE_INFO, mode='w')
    file_handler_info.setFormatter(log_formatter)
    file_handler_info.setLevel(logging.INFO)
    log.addHandler(file_handler_info)

    file_handler_error = logging.FileHandler(LOG_FILE_ERROR, mode='w')
    file_handler_error.setFormatter(log_formatter)
    file_handler_error.setLevel(logging.ERROR)
    log.addHandler(file_handler_error)

    log.setLevel(logging.INFO)

    return log

def main():

    my_logger = get_logger()

    my_logger.info('This is an INFO message')
    my_logger.warning('This is a WARNING message')
    my_logger.error('This is an ERROR message')


if __name__ == '__main__':
    main()

输出

$ python test_log.py
2013-09-20 11:52:07,096 root         INFO     This is an INFO message
2013-09-20 11:52:07,096 root         WARNING  This is a WARNING message
2013-09-20 11:52:07,096 root         ERROR    This is an ERROR message

$ cat file.log
2013-09-20 11:52:07,096 root         INFO     This is an INFO message
2013-09-20 11:52:07,096 root         WARNING  This is a WARNING message
2013-09-20 11:52:07,096 root         ERROR    This is an ERROR message

$ cat file.err
2013-09-20 11:52:07,096 root         ERROR    This is an ERROR message

7

一种方法是使用过滤器,这里有一个很好的例子可以过滤只有一个级别的日志信息,链接在这里

import logging

class InfoFilter(logging.Filter):
    def filter(self, rec):
        return rec.levelno == logging.INFO

然后可以使用Filter对象对 Handler 进行过滤,方法是使用Handler.addFilter(filt)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接