黑马程序员技术交流社区

标题: 【上海校区】python logging模块讲解 [打印本页]

作者: 不二晨    时间: 2018-12-24 11:37
标题: 【上海校区】python logging模块讲解
本帖最后由 不二晨 于 2018-12-24 14:41 编辑

日志字段信息与日志格式

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

事件发生时间

事件发生位置

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

事件内容

上面这些都是一条日志记录中可能包含的字段信息,当然还可以包括一些其他信息,如进程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信息')

---------------------
【转载】仅作分享,侵删

原文:https://blog.csdn.net/qq_24726509/article/details/83899397



作者: 不二晨    时间: 2018-12-26 10:13





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2