解决Logger没有info输出的问题

背景

最近在写爬虫的时候,打算使用logging来输出中间的一些过程,查看过程是否出现错误。写好一个logging类,用于记录。开始测试的好好地,后来进行了一些修改,导致没办法输出info信息。后面通过自己上网搜索,并测试调试找出了原因,这里记录一些

前提知识

首先需要了解logger 事件有五类

DEBUG 指定细粒度信息事件是最有用的应用程序调试

INFO 指定能够突出在粗粒度级别的应用程序运行情况的信息的消息

WARNING 指定具有潜在危害的情况

ERROR 错误事件可能仍然允许应用程序继续运行

FATAL 指定非常严重的错误事件,这可能导致应用程序中止

大概了解logger的Handler,Formatter,Filter等

问题解决

出现没有info的原因大概有两种

第一种:设置了日志级别高于info,就不会输出info信息

第二种:就是我遇到的情况,我定义了多个logger,设置了不同的level,输出不同的信息

但疏忽了一点logger默认的事件级别是WARN

# -*- coding: utf-8 -*-
import logging
import datetime
import os

class WebLogger():
    """程序调试日志-文件和控制台输出"""

    def __init__(self, name):
        """初始化属性"""
        # 初始化日志器
        self.logger =logging.getLogger(name)
        self.logger.setLevel(logging.DEBUG)

        # 初始化日志输出格式器
        file_fmt='%(asctime)s,%(name)s[line:%(lineno)d],%(levelname)s,%(message)s'
        console_fmt='%(name)s[line:%(lineno)d] - %(levelname)s: %(message)s'
        file_formatter = logging.Formatter(file_fmt)
        console_formatter=logging.Formatter(console_fmt)

        #创建路径
        file_path=os.path.join(os.getcwd(),'logs')
        if not os.path.exists(file_path):
            os.mkdir(file_path)

        #初始化info文件处理器
        file_name_info=str(datetime.date.today()) + " log_info.csv"
        file_path_info=file_path+"\\"+file_name_info
        file_handler_info=logging.FileHandler(file_path_info)
        file_handler_info.setLevel(logging.INFO)
        file_handler_info.setFormatter(file_formatter)

        #初始化error文件处理器
        file_name_error=str(datetime.date.today()) + " log_error.csv"
        file_path_error=file_path+"\\"+file_name_error
        file_handler_error=logging.FileHandler(file_path_error)
        file_handler_error.setLevel(logging.ERROR)
        file_handler_error.setFormatter(file_formatter)

        #初始化日志输出流处理器
        console_handler=logging.StreamHandler()
        console_handler.setLevel(logging.INFO)
        console_handler.setFormatter(console_formatter)

        #添加日志处理器
        self.logger.addHandler(file_handler_info)
        self.logger.addHandler(file_handler_error)
        self.logger.addHandler(console_handler)

    def get_logger(self):
        """获得自定义的日志器"""
        return self.logger

'''
DEBUG 	指定细粒度信息事件是最有用的应用程序调试
INFO 	指定能够突出在粗粒度级别的应用程序运行情况的信息的消息
WARNING 指定具有潜在危害的情况
ERROR 	错误事件可能仍然允许应用程序继续运行
FATAL 	指定非常严重的错误事件,这可能导致应用程序中止
'''

测试代码

from WebLogger import WebLogger

mylog=WebLogger("test")
mylog.logger.debug("debug test")
mylog.logger.info("info test")
mylog.logger.warning("warn test")
mylog.logger.error("error test")

一开始我没有设置logger的级别,使用了默认的WARNING级别,后面设置Handler级别,设置的级别比默认的级别低,权限不够,因此输出不了info信息

读者可以自行尝试去掉和不去掉 self.logger.setLevel(logging.DEBUG)

一个结果中包含info信息,一个不包含

本篇简单记录一下,如果还有不明白的地方,可在下方评论区留言,我看到后会尽快回复,希望能和大家一起进步

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐