Python logging.get_Logger(name) 配合 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 个回答
3
这是一个比较老的问题,但我觉得我找到了根本原因和解决办法,至少在更新版的Python中是这样。
第二个代码示例从 log = logging.getLogger(name)
开始,其中 name
被认为是一个字符串,表示日志记录器的名字。因为提供了名字,所以这个 log
不会 是根日志记录器。根据Python 3.6+ 的 Logger.setLevel(level) 文档,
当创建一个日志记录器时,级别被设置为
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'
写入文件。