带有FileHandler的Python logging.get_Logger(name)不会写入文件

时间:2011-10-24 20:14:37

标签: python logging

如果我使用名称获取记录器并添加FileHandler,则不会写入该文件。

这可以正常写入文件:

log = logging.getLogger()
fh = logging.FileHandler(logfile)
log.addHandler(fh)
fh_fmt = logging.Formatter("%(asctime)s (%(levelname)s)\t: %(message)s")
fh.setFormatter(fh_fmt) 
log.setLevel(logging.INFO)

这不会写入文件:

log = logging.getLogger(name)
fh = logging.FileHandler(logfile)
log.addHandler(fh)
fh_fmt = logging.Formatter("%(asctime)s (%(levelname)s)\t: %(message)s")
fh.setFormatter(fh_fmt) 
log.setLevel(logging.INFO)

唯一的区别是我得到了一个'命名'记录器。

1 个答案:

答案 0 :(得分:1)

这是一个相当老的问题,但是我相信至少在使用新版本的Python时,我发现了潜在的问题和解决方案。

第二个代码示例以log = logging.getLogger(name)开头,其中name假定是代表记录器名称的字符串。由于提供了名称,因此log成为根记录器。根据{{​​3}} for Python 3.6 +,

创建记录器时,级别设置为NOTSET(当记录器是根记录器时,将处理所有消息;如果记录器是非根记录器,则将委派给父级)

这告诉我们,我们必须设置记录器的级别,以便它实际上将处理消息,而不是将其传递给根记录器。

这是我在Python 3.7中编写的代码示例,该代码示例无效:

from pathlib import Path
import logging

formatter = logging.Formatter('%(name)s [%(levelname)s] %(message)s')
log_file_dir = Path('./log/')
config_file = 'config_file.txt'
config_file_path = log_file_dir / config_file

logger = logging.getLogger('example_logger')
fh = logging.FileHandler(config_file_path, mode='w')
fh.setLevel(logging.INFO)
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.info('Start Configuration Log')

这一项通过添加一行来实现:

from pathlib import Path
import logging

formatter = logging.Formatter('%(name)s [%(levelname)s] %(message)s')
log_file_dir = Path('./log/')
config_file = 'config_file_2.txt'
config_file_path = log_file_dir / config_file

logger = logging.getLogger('example_logger')
logger.setLevel(logging.INFO) # <------ Or the applicable level for your use-case
fh = logging.FileHandler(config_file_path, mode='w')
fh.setLevel(logging.INFO)
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.info('Start Configuration Log')

注意:第一个代码示例确实创建了所选的日志文件,但没有将'Start Configuration Log'写入该文件。