使用Python logging管理日志记录器

3

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

问题是,如果设置了logging.basicConfig(),它将记录到控制台,但必须在主线程中设置。

也可以使用logging.basicConfig(filename='logger.log')设置为写入文件。

为控制台日志(logging.StreamHandler())或文件日志(logging.FileHandler())设置句柄,补充了logging.baseconfig()选项设置。

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

因此,如果我将baseConfig设置为记录到文件,并将StreamHandler设置为记录到控制台,则文件日志级别必须低于控制台级别。(此外,basicConfig选项记录所有其他日志。)

我尝试创建两个句柄,一个用于控制台,一个用于日志文件,它们可以工作,但是由basicConfig()指定的任何日志类型仍将显示重复的消息。

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

2个回答

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

日志记录器首先接收事件,如果要处理事件(由于比较日志记录器和事件的级别),则将事件传递给日志记录器的每个处理程序以及其所有祖先的处理程序。如果在处理程序上设置了级别,则该处理程序可能会丢弃事件,否则它将输出事件。


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.")
        

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接