使用Python日志记录管理记录器

时间:2010-11-09 16:39:44

标签: python config logging

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

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

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

为控制台日志记录(logging.StreamHandler())或文件日志记录(logging.FileHandler())设置句柄是对logging.baseconfig()选项集的补充。

问题是,设置不是独立的。 我的意思是,logging.baseConfig()的loglevel必须包含Handler级别,否则它不会被记录。

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

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

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

感谢。

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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.")