首页 > 解决方案 > 将python登录到多个文件目的地的正确方法,从setting.ini文件而不组合级别

问题描述

我正在尝试将 python 登录到 settings.ini 文件中的两个文件,具有不同的级别,但其中一个在两个文件中打印

我需要通过控制台和两个文件显示错误消息:

我读过这个以前的帖子:

Python 使用配置文件记录到不同的目的地

Python 日志记录配置文件

这非常有用。我尝试使用 class=FileHandler 和 args=('log_error','w') 为 ERROR 级别定义第二个记录器和第二个 errorHandler,但结果相同。

我认为我的问题与传播属性有关,根据文档在此处https://docs.python.org/3/library/logging.config.html#configuration-file-format的说明,就像这样说python 记录到多个目的地但我没有找到错误。

我尝试将传播设置为 False/0,但它不起作用。

谢谢你的帮助

这是我的主文件:

from settings import *

def main():
#   logger.info("2")
    logger.error("4")

if __name__ == "__main__":
    main()

这是我的 settings.py 文件:

# -*- coding: utf-8 -*-
import os
import logging
import logging.config
from configparser import RawConfigParser

BASE_DIR = os.getcwd()
config = RawConfigParser()
config.read(BASE_DIR + '/settings.ini')

logging.config.fileConfig(fname=config, disable_existing_loggers=True)

# Create a custom logger
logger = logging.getLogger(__name__)

# Create handlers
handler_info = logging.FileHandler('log_info.log')
handler_error = logging.FileHandler('log_error.log')
handler_info.setLevel(logging.INFO)
handler_error.setLevel(logging.ERROR)

# Create formatters and add it to handlers
format_info = logging.Formatter('%(asctime)s - %(levelname)s - %(module)s : %(message)s')
format_error = logging.Formatter('%(asctime)s - %(levelname)s - %(module)s - %(lineno)d - %(message)s')
handler_info.setFormatter(format_info)
handler_error.setFormatter(format_error)

# Add handlers to the logger
logger.addHandler(handler_info)
logger.addHandler(handler_error)

这是我的 settings.ini 文件:

[loggers]
keys=root

[handlers]
keys=consoleHandler

[formatters]
keys=sampleFormatter

[logger_root]
level=INFO
handlers=consoleHandler

[handler_consoleHandler]
class=StreamHandler
level=ERROR
formatter=sampleFormatter
args=(sys.stdout,)

[formatter_sampleFormatter]
format=%(asctime)s - %(levelname)s - %(message)s

当我打印一条 INFO 消息时,一切正常,但是当打印错误时,它会写入消息 log_error.log 和 log_info.log 以及控制台。如果发生错误,我不需要写入 log_info.log。

标签: pythonlogging

解决方案


您可以将自定义过滤器添加到您的处理程序。

import logging

def custom_filter(record):
    if record.levelname == 'INFO':
        return True

handler = logging.StreamHandler()
handler.addFilter(custom_filter)

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)

logger.debug('1')
logger.info('2')
logger.error('3')

2

可以阅读日志模块源码,很容易理解,只有custom_filter返回值才能转换为True,否则日志记录将被忽略。


推荐阅读