美文网首页
python日志管理

python日志管理

作者: S_jie | 来源:发表于2020-08-05 18:45 被阅读0次

    python的logging如果不设置,那么系统会默认值输出warning和高于warning的日志信息,如图下:

    import logging
    
    logging.debug('debug')
    logging.info('info')
    logging.warning('warning')
    logging.error('error')
    logging.critical('critical') 
    

    上面打印了debug、info但是系统默认配置只会输出warning和高于warning的日志信息。

    WARNING:root:warn message
    ERROR:root:error message
    CRITICAL:root:critical message
    
    Process finished with exit code 0
    

    关于日志的级别设置、输出方式、和输出到日志文件中下面慢慢讲解。
    首先要了解日志的级别都有哪些


    日志级别

    日志输出级别

    通过logging.basicConfig函数来设置日志的输出级别

    import logging
    
    #  通过basicConfig里的level来控制日志的输出级别
    logging.basicConfig(level=logging.DEBUG)
    logging.debug('debug')
    logging.info('info')
    logging.warning('warning')
    logging.error('error')
    logging.critical('critical')
    

    这时候再去执行就会发现输出的日志级别已经发生变化,我们可以通过basicConfig里的level来控制日志的输出

    DEBUG:root:debug
    INFO:root:info
    WARNING:root:warning
    ERROR:root:error
    CRITICAL:root:critical
    
    Process finished with exit code 0
    

    文件输出

    之前做的只是在控制台输出,在开发过程中记录日志也是很重要的。所以必须的学会制定日志的输出方式,不只是在控制台输出。

    import logging
    
    #  通过basicConfig里的filename来控制日志的输出的方式
    logging.basicConfig(filename='base.log', level=logging.INFO)
    logging.debug('debug')
    logging.info('info')
    logging.warning('warning')
    logging.error('error')
    logging.critical('critical')
    

    这个时候就会发现控制台什么都没有输出,但是咋们执行文件的目录下多出了base.log文件。打开后控制台输出的信息都存到这里面去了。


    base.log

    到这里大家基本应该了解到了。logging里的basicConfig可以完成这些配置
    首先得了解logging的构成
    logging模块包括logger,Handler,Filter,Formatter四个部分。

    • Logger 记录器,用于设置日志采集,root(系统的)还可以自己定义采集器
    • Handler 处理器,指定日志发送的路径
    • Filter 过滤器,控制输出哪些日志
    • Formatter 格式化器,指定输出中日志的格式。

    Logger 记录器

    创建一个记录器,指定日志输出级别:debug,info,warning,error,critical,如果没有创建,系统会默认给出一个root logger并应用默认的日志级别warning,
    创建方法 :
    logger = logging.getLogger(logger_name)

    Handler 处理器

    logging中较常用的有三个,StreamHandler,FileHandler,NullHandler,
    NullHandler这个基本用不上也没必要了解。

    StreamHandler

    sh = logging.StreamHandler(stream=None)

    FileHandler

    fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)

    Formatter 格式化

    使用Formatter设置日志信息内容默认时间格式为%Y-%m-%d %H:%M:%S。fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,将使用'%(message)s'。如果不指明datefmt,将使用ISO8601日期格式。

    Formatter

    formatter = logging.Formatter(fmt=None, datefmt=None)

    Filter 过滤器

    filter = logging.Filter(name='')

    basicConfig关键字参数

    basicConfig关键字参数

    format格式

    format格式

    总结

    上面描述了logging模块的基本使用和一些常用信息,在正常使用过程中:

    import logging
    
    # 新建记录器
    logger = logging.getLogger('con_log')
    logger.setLevel(logging.DEBUG)  # 设置打印log级别为debug
    
    # 文件处理
    fh = logging.FileHandler("../run_log.log")
    fh.setLevel(logging.WARN)
    
    # 指定日志输出格式
    fmt = "%(asctime)-15s %(levelname)s %(filename)s %(lineno)d %(process)d %(message)s"
    datefmt = "%a %d %b %Y %H:%M:%S"
    formatter = logging.Formatter(fmt, datefmt)
    
    # 将处理程序和日志格式添加到记录器
    fh.setFormatter(formatter)
    logger.addHandler(fh)
    
    logger.debug('debug')
    logger.info('info')
    logger.warning('warning')
    logger.error('error')
    logger.critical('critical')
    

    这样基本就定义好了一个日志的输出格式了。但是这样用在项目里很繁琐,需要每个文件都加上这个,最好的处理办法,就是把这个写成一个配置文件,放在项目配置目录下,直接读取。

    新建文件log.conf

    #指定两种采集器,一种是系统的一种自己定义的
    [loggers]
    keys=root,DEBUGLogger
    
    # 系统采集器信息
    [logger_root]
    # 输出级别定位debug
    level=DEBUG
    # 日志输出路径为控制台和指定文件
    handlers=consoleHandler,fileHandler
    
    # 自定义采集器
    [logger_DEBUGLogger]
    # 日志输出路径为控制台和指定文件
    handlers=consoleHandler,fileHandler
    # 引用名称
    qualname=DEBUGLogger
    # 0输出日志,但是消息不传递,1输出日志,消息往更高级别传递,root为最高级别
    propagate=0
    
    # 控制日志输出流向
    [handlers]
    # 控制台输出、文件输出
    keys=consoleHandler,fileHandler
    
    # 输出到控制台的具体配置
    [handler_consoleHandler]
    # 指定文件类型流输出
    class=StreamHandler
    # 指定输出级别
    level=DEBUG
    # 引用格式的预定义
    formatter=form02
    # 指定标准量输出
    args=(sys.stdout,)
    
    # 输出到文件的具体配置
    [handler_fileHandler]
    class=FileHandler
    level=DEBUG
    formatter=form01
    args=('runlog.log', 'a')
    
    [formatters]
    keys=form01,form02
    
    # 文件输出,预定义输出流格式
    [formatter_form01]
    format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
    
    # 控制台输出,预定义输出流格式
    [formatter_form02]
    format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
    

    调用:

    import logging
    import logging.config
    
    CON_LOG = 'xxx/xxx/log.conf'
    logging.config.fileConfig(CON_LOG)
    logging = logging.getLogger()
    

    相关文章

      网友评论

          本文标题:python日志管理

          本文链接:https://www.haomeiwen.com/subject/bcrorktx.html