我正在处理与Python日志记录特定级别相同的问题
我检查了留档,上面写着:
fileConfig()API比dictConfig()API旧,不提供涵盖日志记录某些方面的功能。例如,您不能使用fileConfig()配置筛选器对象,该对象提供对简单整数级别以外的消息的筛选。如果需要在日志记录配置中包含筛选器实例,则需要使用dictConfig()。请注意,未来对配置功能的增强将添加到dictConfig(),因此在方便的情况下,值得考虑转换到这个较新的API。
我已经使用dictConfig检查了python中日志级别的安装过滤器,其中有一个完整的日志示例。配置。口述配置?
我的最新python文件如下所示:
import logging
import logging.config
import yaml
with open('logging.yaml', 'rt') as f:
config = yaml.safe_load(f.read())
logging.config.dictConfig(config)
logger = logging.getLogger('module1')
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
logging.yaml
文件看起来像:
version: 1
formatters:
simple:
format: '{asctime} : {name} : {levelname} : {message}'
style: '{'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
loggers:
module1:
level: DEBUG
handlers: [console]
propogate: no
root:
level: DEBUG
handlers: [console]
不了解如何修改日志记录。yaml
文件,这样我可以在控制台中只查看信息,并将关键、错误、警告保存到日志文件。日志
。
在这里。
我希望我能够通过修改日志来配置过滤器。yaml
文件。不幸的是,我不得不创建过滤类(在我的例子中是infoFilter
和criticalFilter
)。
以下代码记录终端中的INFO和文件中的警告、错误或关键。
Python代码:
import logging
import os
import logging.config
import yaml
DEFAULT_LEVEL = logging.DEBUG
class infoFilter(logging.Filter):
def filter(self, log_record):
return log_record.levelno == logging.INFO
class warningerrorcriticalFilter(logging.Filter):
def filter(self, log_record):
if log_record.levelno in {logging.WARNING, logging.ERROR, logging.CRITICAL}:
return True
else:
return False
def log_setup(log_cfg_path='config.yaml'):
if os.path.exists(log_cfg_path):
with open(log_cfg_path, 'r') as f:
try:
config = yaml.safe_load(f.read())
logging.config.dictConfig(config)
except Exception as e:
print('Error with file, using Default logging')
logging.basicConfig(level=DEFAULT_LEVEL)
else:
logging.basicConfig(level=DEFAULT_LEVEL)
print('Config file not found, using Default logging')
log_setup()
logger = logging.getLogger('dev')
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error("error message")
logger.critical('critical message')
config.yaml
文件:
version: 1
formatters:
extended:
format: '%(asctime)-20s :: %(levelname)-8s :: [%(process)d]%(processName)s :: %(threadName)s[%(thread)d] :: %(pathname)s :: %(lineno)d :: %(message)s'
simple:
format: "%(asctime)s :: %(name)s :: %(message)s"
filters:
show_only_info:
(): __main__.infoFilter
show_only_warningerrorcritical:
(): __main__.warningerrorcriticalFilter
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
filters: [show_only_info]
file_handler:
class: logging.FileHandler
filename: my_app.log
formatter: extended
level: DEBUG
filters: [show_only_warningerrorcritical]
loggers:
dev:
handlers: [console, file_handler]
propagate: false
prod:
handlers: [file_handler]
root:
level: DEBUG
handlers: [console]
恐怕您必须创建自己的筛选器。
尝试将级别设置为INFO
,将显示INFO
及以上内容。日志模块中没有允许您只过滤掉特定级别的过滤器。
幸运的是,过滤器可以很容易地创建,因为它们的唯一要求是一个Filter
对象,或者任何返回布尔值的可调用对象。
在您的情况下,向控制台处理程序添加以下筛选器:
处理程序。addFilter(lambda记录:record.levelname==“INFO”)