【问题标题】:Logging to two files with different settings记录到具有不同设置的两个文件
【发布时间】:2012-06-29 05:46:21
【问题描述】:

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

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

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

所以,简而言之:

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

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

【问题讨论】:

    标签: python python-3.x logging logfile


    【解决方案1】:

    你可以这样做:

    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')
    

    【讨论】:

    • 默认的日志级别是logging.WARNING,所以如果调用Logger.setLevel(logging.WARNING)会更清楚。
    • 为什么我的logger_1 没有输出到日志文件?我设置了logger_1.error('error foo'),但还是不行
    • 结合来自@zeekvfu 的评论和来自@Gank 的问题...如果你想看到simplefile_1.log 中的logger_1.info('message_1') 行,你需要将级别设置为INFO 使用logger_1.setLevel(logging.INFO),或改用logger_1.error('message_1')。当级别为WARNING(这是默认值)时,显然不会记录INFO 消息。
    • 编辑了答案。将 logger_1.info 设置为 logger_1.warning。这样就不用设置关卡了。
    • @eos87 logger_1 和 logger_2 是全局的吗?即,我可以在任何函数中使用它们吗?如果没有,在 def main 函数中将它们设为全局是一个好主意吗?如果是这样,你会怎么做?
    【解决方案2】:
    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')
    

    【讨论】:

    • logger_1 和 logger_2 是全局的吗?即,我可以在任何函数中使用它们吗?如果没有,在 def main 函数中将它们设为全局是一个好主意吗?如果是这样,你会怎么做?
    • 你不会在 def 中这样做,你会在任何你定义你的记录器的地方这样做。
    • 这不会导致重复的控制台输出吗?
    猜你喜欢
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2012-08-09
    • 2011-01-30
    相关资源
    最近更新 更多