使用 python 日志记录模块将消息信息发送到一个文件,并将错误发送到另一个文件



我找到了一些类似的例子来记录消息到多个文件。但没有什么完全符合我想要的。我正在使用日志记录模块,并且正在将所有信息消息记录到控制台和文件。(稍后我将关闭控制台日志记录)。

但是,我希望将其扩展为将所有信息消息记录到文件中.log并将所有错误消息记录到file.err。如果可以将所有消息记录到文件.log(错误和信息),然后将所有错误消息记录到单独的文件中,那就更好了。

这可能吗?

---------

显然,我无法

在 7 小时内回答我自己的问题,所以我只会更新我原来的问题。

---------

我现在觉得自己很傻。在发布之前尝试了几个小时的示例后,我"再次"发现了这个。这就像在阅读示例时输入我试图做的事情的任务触发了一些东西。

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

这会将 INFO 级别及更高级别的所有内容输出到一个日志文件 (log_file),然后将 logging.error 和 logging。警告消息打印到单独的文件 (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)

> 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

一种方法是插入过滤器,这里提供了一个仅过滤一个级别的很好的例子:

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

然后Filter对象可以通过方法 Handler.addFilter(filt)Handler上使用

最新更新