从setting.ini文件中将python登录到多个文件目标的正确方法,而无需组合级别

时间:2019-04-10 02:55:36

标签: python logging

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

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

  • 控制台和日志文件的错误级别
  • 和INFO级别仅按文件显示。

我阅读了以前的帖子:

Python logging to different destination using a configuration file

Python logging configuration file

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

我认为我的问题与文档https://docs.python.org/3/library/logging.config.html#configuration-file-format在此处所说的{propertys属性有关,而这样说python logging to multiple destination,但我没有发现错误。

我尝试将传播设置为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中写。

1 个答案:

答案 0 :(得分:0)

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

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,否则日志记录将被忽略。