配置文件中的文件处理程序记录罕见行为
FileHandler in config file logging rare behabior
我有一个日志配置文件:
logger_config.yml
version: 1
formatters:
simple:
format: '%(asctime)s - %(levelname)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
file:
class: logging.FileHandler
level: DEBUG
formatter: simple
filename: train.log
loggers:
trainLogger:
level: DEBUG
handlers: [console]
propagate: 1
root:
level: DEBUG
handlers: [console]
propagate: 1
还有一个简单的脚本:
test.py
import logging
import logging.config
import yaml
with open('logging_config.yml', 'rt') as f:
config = yaml.safe_load(f.read())
logging.config.dictConfig(config)
# create logger
logger = logging.getLogger(__name__)
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
当我 运行 test.py
时,假设脚本将只登录控制台,因为 root
的 handler
是 console
但空 train.log 也被创建。为什么要追加?
您在加载记录器实例时正在创建一个 fileHandler
,即使您仅 使用 consoleHandler
。如果您只是 运行 shell 中的以下内容:
import logging
fh = logging.FileHandler("mylogger.txt")
quit()
您会看到 "mylogger.txt" 已创建。这是因为在幕后,处理程序在 __init__
时创建文件,而不是在使用时创建文件。这样设计更好,因为您可能 使用 多次使用该处理程序,可能同时进行,并且您不想每次都检查文件是否存在,因为会很慢,你可以在尝试创建文件时引入竞争条件
我有一个日志配置文件:
logger_config.yml
version: 1
formatters:
simple:
format: '%(asctime)s - %(levelname)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
file:
class: logging.FileHandler
level: DEBUG
formatter: simple
filename: train.log
loggers:
trainLogger:
level: DEBUG
handlers: [console]
propagate: 1
root:
level: DEBUG
handlers: [console]
propagate: 1
还有一个简单的脚本:
test.py
import logging
import logging.config
import yaml
with open('logging_config.yml', 'rt') as f:
config = yaml.safe_load(f.read())
logging.config.dictConfig(config)
# create logger
logger = logging.getLogger(__name__)
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
当我 运行 test.py
时,假设脚本将只登录控制台,因为 root
的 handler
是 console
但空 train.log 也被创建。为什么要追加?
您在加载记录器实例时正在创建一个 fileHandler
,即使您仅 使用 consoleHandler
。如果您只是 运行 shell 中的以下内容:
import logging
fh = logging.FileHandler("mylogger.txt")
quit()
您会看到 "mylogger.txt" 已创建。这是因为在幕后,处理程序在 __init__
时创建文件,而不是在使用时创建文件。这样设计更好,因为您可能 使用 多次使用该处理程序,可能同时进行,并且您不想每次都检查文件是否存在,因为会很慢,你可以在尝试创建文件时引入竞争条件