使用Python logging管理日志记录器

3 投票
2 回答
4491 浏览
提问于 2025-04-16 06:48

我正在写一个服务器应用程序,它应该能够在控制台和日志文件中以不同的级别记录信息。

问题是,如果设置了 logging.basicConfig(),它会在控制台输出日志,但这个设置必须在主线程中进行。

你也可以用 logging.basicConfig(filename='logger.log') 来设置将日志写入文件。

如果你想分别为控制台日志(使用 logging.StreamHandler())或文件日志(使用 logging.FileHandler())设置处理器,这样做是可以的,它们会补充 logging.basicConfig() 的设置。

但问题是,这些设置并不是独立的。我的意思是,logging.basicConfig() 的日志级别必须包括处理器的级别,否则就不会记录日志。

所以,如果我把 basicConfig 设置为写入文件,并且用 StreamHandler 设置为输出到控制台,那么文件的日志级别必须低于控制台的级别。(另外,basicConfig 的设置会记录所有其他日志。)

我尝试创建两个处理器,一个用于控制台,一个用于日志文件,它们可以正常工作,但无论通过 basicConfig() 指定什么日志类型,消息都会重复显示。

有没有办法禁用 basicConfig() 的输出?或者有没有其他方法来实现这些选项?

2 个回答

0

下面是一个示例代码,用来处理各种异常的日志记录。

import mysql.connector
import logging
logging.basicConfig(filename=r'C:\Users\root\Desktop\logs.txt',level=logging.DEBUG,format='%(asctime)s,%(levelname)s:%(message)s',datefmt='%d-%m-%Y %H:%M:%S')

while True:
    try:
        mydb=mysql.connector.connect(host='localhost',user='root',passwd='password123', database='shiva')

        mycursor=mydb.cursor()
        logging.info("Connected mysql db successfully...\n")
        mycursor.execute("show databases")
        mycursor.execute("Create table employee(name varchar(20), salary float(20))")
        mydb.commit()
    except Exception as e:
        logging.info("Trying to Connect MysqlDB...")
        logging.critical("Error Occured While Connecting...\n\n" "CAUSEDBY: "+str(e))
        logging.warning("Check Login Credentials.")
        
4

你在问题中没有具体说明你想要在控制台和文件日志中显示什么级别的信息。不过,你其实不需要调用 basicConfig(),因为它只是一个方便的函数。你可以直接这样做(这段代码只是随便写的,没经过测试):

import logging

logger = logging.getLogger(__name__)
configured = False

def configure_logging():
    global configured
    if not configured:
        logger.setLevel(logging.DEBUG) # or whatever
        console = logging.StreamHandler()
        file = logging.FileHandler('/path/to/file')
        #set a level on the handlers if you want;
        #if you do, they will only output events that are >= that level
        logger.addHandler(console)
        logger.addHandler(file)
        configured = True

事件首先会传递给日志记录器,如果这个事件需要处理(这是通过比较日志记录器的级别和事件的级别来决定的),那么这个事件就会被传递给日志记录器的每一个处理器,以及它所有父级处理器的处理器。如果某个处理器设置了级别,那么这个处理器可能会丢弃这个事件,否则它就会输出这个事件。

撰写回答