如果我使用名称获取记录器并添加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)
唯一的区别是我得到了一个'命名'记录器。
答案 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'
写入该文件。