登录到具有不同设置的两个文件


79

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

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

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

因此,简而言之:

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

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

Answers:


145

您可以执行以下操作:

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 2014年

1
为什么我logger_1不输出到日志文件?我已经设定了logger_1.error('error foo'),但仍然无法使用
Gank

结合@zeekvfu的评论和@Gank的问题...如果要查看中的logger_1.info('message_1')simplefile_1.log,则需要将级别设置为INFOusing logger_1.setLevel(logging.INFO),或者logger_1.error('message_1')改为使用。一个INFO消息显然不会得到记录时的水平WARNING,这是默认的。
dnlbrky 2015年

编辑答案。将logger_1.info设置为logger_1.warning。这样,不必设置级别。
user1812076 2015年

1
@ eos87 logger_1和logger_2是否全局?即,我可以在任何函数中使用它们吗?如果不是,将它们在def main函数中全局化是个好主意吗?如果是这样,您将如何处理?
Dnaiel '17

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

1
logger_1和logger_2是否是全局的?即,我可以在任何函数中使用它们吗?如果不是,将它们在def main函数中全局化是个好主意吗?如果是这样,您将如何处理?
Dnaiel

您不会在def中执行此操作,而是在定义记录器的任何位置执行该操作。
Alex R

1
这会不会导致控制台输出重复?
Erol
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.