提问者:小点点

如何使用。仅用于记录特定级别的yaml文件


我正在处理与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文件,这样我可以在控制台中只查看信息,并将关键、错误、警告保存到日志文件。日志


共2个答案

匿名用户

在这里。

我希望我能够通过修改日志来配置过滤器。yaml文件。不幸的是,我不得不创建过滤类(在我的例子中是infoFiltercriticalFilter)。

以下代码记录终端中的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”)