python logging模块讲解


日志字段信息与日志格式

一条日志信息对应的是一个事件的发生,而一个事件通常需要包括以下几个内容:

  • 事件发生时间

  • 事件发生位置

  • 事件的严重程度--日志级别

  • 事件内容

上面这些都是一条日志记录中可能包含的字段信息,当然还可以包括一些其他信息,如进程ID、进程名称、线程ID、线程名称等。日志格式就是用来定义一条日志记录中包含那些字段的,且日志格式通常都是可以自定义的。
 

日志功能的实现

几乎所有开发语言都会内置日志相关功能,或者会有比较优秀的第三方库来提供日志操作功能,比如:log4j,log4php等。它们功能强大、使用简单。Python自身也提供了一个用于记录日志的标准库模块--logging。

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:

  • 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;

  • print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出。
     

    1、 logging模块的日志级别

    logging模块默认定义了以下几个日志等级,它允许开发人员自定义其他日志级别,但是这是不被推荐的,尤其是在开发供别人使用的库时,因为这会导致日志级别的混乱。

    日志等级(level) 描述
    DEBUG 最详细的日志信息,典型应用场景是 问题诊断
    INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
    WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
    ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
    CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息

应用上线或部署生产环境时,应该使用WARNING或ERROR或CRITICAL级别的日志来降低机器的I/O压力和提高获取错误日志信息的效率。日志级别的指定通常都是在应用程序的配置文件中进行指定的。

  • 上面列表中的日志等级是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的;

  • 当为某个应用程序指定一个日志级别后,应用程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息,nginx、php等应用程序以及这里的python的logging模块都是这样的。同样,logging模块也可以指定日志记录器的日志级别,只有级别大于或等于该指定日志级别的日志记录才会被输出,小于该等级的日志记录将会被丢弃。

  • logging模块定义的模块级别的常用函数

    函数 说明
    logging.debug(msg, *args, **kwargs) 创建一条严重级别为DEBUG的日志记录
    logging.info(msg, *args, **kwargs) 创建一条严重级别为INFO的日志记录
    logging.warning(msg, *args, **kwargs) 创建一条严重级别为WARNING的日志记录
    logging.error(msg, *args, **kwargs) 创建一条严重级别为ERROR的日志记录
    logging.critical(msg, *args, **kwargs) 创建一条严重级别为CRITICAL的日志记录
    logging.log(level, *args, **kwargs) 创建一条严重级别为level的日志记录
    logging.basicConfig(**kwargs) 对root logger进行一次性配置

    其中logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。
    默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG)

    #首先设置日志的名称,并指定日志的级别
    #指定记录日志的路径,并设置记录日志的级别
    #指定输出在cmd窗口的对象,并设置显示级别
    #设置记录日志和显示窗口日志的格式
    #将记录日志和显示窗口日志的格式分别加入相应的对象
    #开始打印日志

    #窗口显示日志与颜色的混用,配合ctypes使用,在linux中,不存在windll模块,c相关的不清楚,欢迎留言解决

    import logging,ctypes
    class Logger():
        def __init__(self,path,clevel=logging.DEBUG,flevel=logging.DEBUG):
            self.logger=logging.getLogger(path)
            self.logger.setLevel(logging.DEBUG)
            fmt=logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s','%Y-%m-%d %H:%M:%S')
            #设置cmd日志
            sh=logging.StreamHandler()
            sh.setFormatter(fmt)
            sh.setLevel(clevel)
            #设置文件日志
            fh=logging.FileHandler(path)
            fh.setFormatter(fmt)
            fh.setLevel(flevel)
            #将设置好的加入logger对象
            self.logger.addHandler(sh)
            self.logger.addHandler(fh)
            #设置窗口显示的错误级别的颜色
            self.show_white=0x0007
            self.show_blue=0x01
            self.show_green=0x02
            self.show_red=0x04
            self.show_yellow=self.show_red|self.show_green
            self.std_output_handles=-11
            self.std_output_handle=ctypes.windll.kernel32.GetStdHandle(self.std_output_handles)
        def debug(self,message):
            self.logger.debug(message)
        def info(self,message):
            self.logger.info(message)
        def war(self,message):
            color=self.show_yellow
            self.set_color(color)
            self.logger.warning(message)
        def error(self,message):
            color=self.show_red
            self.set_color(color)
            self.logger.error(message)
        def cri(self,message):
            self.logger.critical(message)
        def set_color(self,color):
            handle=self.std_output_handle
            bool=ctypes.windll.kernel32.SetConsoleTextAttribute(handle,color)
            return bool
    if __name__=='__main__':
        logyyx=Logger('/root/python_test/logs/alllog.log',logging.ERROR,logging.DEBUG)
        logyyx.debug('一个debug信息')
        logyyx.info('一个info信息')
        logyyx.war('一个warning信息')
        logyyx.error('一个error信息')
        logyyx.cri('一个致命的critical信息')
    



     

猜你喜欢

转载自blog.csdn.net/qq_24726509/article/details/83899397