zoukankan      html  css  js  c++  java
  • Python日志模块之你还在用PRINT打印日志吗

     

    import logging
    
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                        datefmt='%a, %d %b %Y %H:%M:%S',
                        filename='test.log',
                        filemode='w')
    
    logging.debug('debug level')
    logging.info('info level')
    logging.warning('warning level')
    logging.error('error level')
    logging.critical('critical level')

    我们知道在日常写Python程序的时候开业用print来打印一些日志,当然在小的程序里不用出现什么问题,但是你有没有想过当你的代码量到成千上万行的时候,还是用print来打印,那就是灾难,今天就给大家介绍下python中的日志模块 logging模块。

    logging可以分成两部分来讲

    1.logging, 重点在于logging.basicConfig

    2.logger对象,重点在于FileHandler(用于向文件输出)和StreamHandler(用于向控制台输出)

    下面看看案例

    方法一logging (注意我们新建py文件的时候,py文件名不要和包的名称一样,就是py文件名字不要建成logging.py, 不然会报错)

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

     
    结果:

    WARNING:root:warning level
    ERROR:root:error level
    CRITICAL:root:critical level

    我们会发现下面2个没有输出到控制台,这是因为我们python里面的默认日志级别是warning

    logging.debug('debug level')
    logging.info('info level')
     

    下面我们自己设置下日志级别看看,也就是logging模块的重点logging.basicConfig

    import logging

    logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    datefmt='%a, %d %b %Y %H:%M:%S',
    filename='test.log',
    filemode='w')

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

    我们会发现控制台没有输出,但是py文件的同路径出现一个test.log的日志文件

    或者我们不加filename='test.log'

    import logging

    logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    datefmt='%a, %d %b %Y %H:%M:%S',
    # filename='test.log',
    filemode='w')

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

    结果

    Sun, 24 Mar 2019 11:37:26 log.py[line:9] DEBUG debug level
    Sun, 24 Mar 2019 11:37:26 log.py[line:10] INFO info level
    Sun, 24 Mar 2019 11:37:26 log.py[line:11] WARNING warning level
    Sun, 24 Mar 2019 11:37:26 log.py[line:12] ERROR error level
    Sun, 24 Mar 2019 11:37:26 log.py[line:13] CRITICAL critical level
     

    控制台完整输出了从debug到critical的日志,而且是按照我们要想的格式

    是不是更赏心悦目了呢

    下面是basicConfig的参数介绍,来源于网络截取(https://www.cnblogs.com/yuanchenqi/articles/6766020.html)

    侵权删

    logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:

    filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
    filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    format:指定handler使用的日志显示格式。
    datefmt:指定日期时间格式。
    level:设置rootlogger(后边会讲解具体概念)的日志级别
    stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

    format参数中可能用到的格式化串:
    %(name)s Logger的名字
    %(levelno)s 数字形式的日志级别
    %(levelname)s 文本形式的日志级别
    %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
    %(filename)s 调用日志输出函数的模块的文件名
    %(module)s 调用日志输出函数的模块名
    %(funcName)s 调用日志输出函数的函数名
    %(lineno)d 调用日志输出函数的语句所在的代码行
    %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
    %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
    %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    %(thread)d 线程ID。可能没有
    %(threadName)s 线程名。可能没有
    %(process)d 进程ID。可能没有
    %(message)s用户输出的消息
     

    那说到这里有人是不是就发现了,上面的方式要不就是把日志输出到控制台,要不就是输出到日志文件,那么如果我即想输出到控制台也想输出到文件, 那怎么办呢?那就要用我们今天说的第二种方法 logger对象。

    2. logger对象,这样就可以同时向文件和控制台打印日志了,解释都在代码里。

    import logging

    #固定写法
    # logger = logging.getLogger()
    logger = logging.getLogger('mylogger')

    #设置日志级别
    logger.setLevel(logging.DEBUG)


    # 创建一个FileHandler,用于写入日志文件
    File = logging.FileHandler('test.log')

    # 再创建一个StreamHandler,用于输出到控制台
    consle = logging.StreamHandler()

    #定义输出格式,可以自己定
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    #绑定格式和FileHandler,StreamHandler
    File.setFormatter(formatter)
    consle.setFormatter(formatter)

    #logger对象可以添加多个FileHandler和consle对象
    logger.addHandler(File)
    logger.addHandler(consle)


    #输出
    logger.debug('logger debug level')
    logger.info('logger info level')
    logger.warning('logger warning level')
    logger.error('logger error level')
    logger.critical('logger critical level')

    好了今天的日志模块就介绍这么多吧,至于日志模块也可以通过配置文件来操作,原理其实一样,只是换成文件来存储配置信息。
    ————————————————
    版权声明:本文为CSDN博主「yrg5101」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/yrg5101/java/article/details/88825141

  • 相关阅读:
    QFramework 使用指南 2020(二):下载与版本介绍
    QFramework 使用指南 2020 (一): 概述
    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践
    Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
    Unity 游戏框架搭建 2017 (二十三) 重构小工具 Platform
    Unity 游戏框架搭建 2017 (二十二) 简易引用计数器
    Unity 游戏框架搭建 2017 (二十一) 使用对象池时的一些细节
    你确定你会写 Dockerfile 吗?
    小白学 Python 爬虫(8):网页基础
    老司机大型车祸现场
  • 原文地址:https://www.cnblogs.com/xiondun/p/12955912.html
Copyright © 2011-2022 走看看