我试图从settings.ini文件中将python登录到两个文件,具有不同的级别,但是其中一个在两个文件中都打印
我需要通过控制台和两个文件显示错误消息:
我阅读了以前的帖子:
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中写。
答案 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,否则日志记录将被忽略。