使用不同设置记录到两个文件

125

我已经使用了一个基本的日志配置,其中所有模块的消息都存储在单个文件中。但是,现在我需要一个更复杂的解决方案:

  • 两个文件:第一个保持不变。
  • 第二个文件应具有一些自定义格式。

我一直在阅读该模块的文档,但它们对我来说非常复杂。日志记录器、处理程序...

所以,简而言之:

如何在Python 3中记录到两个文件,即:

import logging
# ...
logging.file1.info('Write this to file 1')
logging.file2.info('Write this to file 2')
2个回答

240

你可以像这样做:

import logging
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')


def setup_logger(name, log_file, level=logging.INFO):
    """To setup as many loggers as you want"""

    handler = logging.FileHandler(log_file)        
    handler.setFormatter(formatter)

    logger = logging.getLogger(name)
    logger.setLevel(level)
    logger.addHandler(handler)

    return logger

# first file logger
logger = setup_logger('first_logger', 'first_logfile.log')
logger.info('This is just info message')

# second file logger
super_logger = setup_logger('second_logger', 'second_logfile.log')
super_logger.error('This is an error message')

def another_method():
   # using logger defined above also works here
   logger.info('Inside method')

1
默认的日志级别是logging.WARNING,因此如果调用Logger.setLevel(logging.WARNING)将更清晰。 - zeekvfu
2
为什么我的 logger_1 没有输出到日志文件?我已经设置了 logger_1.error('error foo'),但仍然无效。 - Gank
结合@zeekvfu的评论和@Gank的问题...如果你想在simplefile_1.log中看到logger_1.info('message_1')这一行,你需要使用logger_1.setLevel(logging.INFO)将级别设置为INFO,或者改用logger_1.error('message_1')。显然,在级别为WARNING(默认级别)时,INFO消息不会被记录。 - dnlbrky
2
@eos87 logger_1和logger_2是全局的吗?也就是说,我可以在任何函数内部使用它们吗?如果不是,那么将它们设置为def main函数中的全局变量是否是一个好主意?如果是,你会如何实现? - Dnaiel
1
@Dnaiel 我更新了答案。你可以在导入后定义你的记录器,然后在整个模块中使用它们。 - eos87
显示剩余3条评论

26
def setup_logger(logger_name, log_file, level=logging.INFO):
    l = logging.getLogger(logger_name)
    formatter = logging.Formatter('%(message)s')
    fileHandler = logging.FileHandler(log_file, mode='w')
    fileHandler.setFormatter(formatter)
    streamHandler = logging.StreamHandler()
    streamHandler.setFormatter(formatter)

    l.setLevel(level)
    l.addHandler(fileHandler)
    l.addHandler(streamHandler)    


setup_logger('log1', txtName+"txt")
setup_logger('log2', txtName+"small.txt")
logger_1 = logging.getLogger('log1')
logger_2 = logging.getLogger('log2')




logger_1.info('111messasage 1')
logger_2.info('222ersaror foo')

2
logger_1和logger_2是全局的吗?也就是说,我可以在任何函数内使用它们吗?如果不是,那么在def main函数中将它们设为全局变量是一个好主意吗?如果是,你会怎么做? - Dnaiel
你不会在def中这样做,而是在定义日志记录器的任何地方这样做。 - Alex R
4
这会导致控制台输出重复吗? - Erol

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