美文网首页
Python之日志记录模块logging

Python之日志记录模块logging

作者: SlashBoyMr_wang | 来源:发表于2018-12-24 00:34 被阅读0次

    一、简单的将日志打印到屏幕

    默认情况下,会打印WARNING级别的日志
    DEBUG:详细信息,调试信息。
    INFO:确认一切按预期运行。
    WARNING:表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了')。软件还是在正常工作。
    ERROR:由于更严重的问题,软件已不能执行一些功能了。
    CRITICAL:严重错误,表明软件已不能继续运行了。

    import logging
    
    logging.debug('debug message') # 调试的时候
    logging.info('info message')
    logging.warning('warning message')
    logging.error('error message')
    logging.critical('critical message') # 批判的
    

    以上代码输出:


    屏幕快照 2018-12-23 下午8.53.42.png

    二、通过basicConfig函数来对日志的输入格式和方法进行配置

    logging.basicConfig函数各参数:

    • filename: 指定日志文件名
    • filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
    • format: 指定输出的格式和内容,format可以输出很多有用信息:
    %(levelno)s: 打印日志级别的数值
    %(levelname)s: 打印日志级别名称
    %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
    %(filename)s: 打印当前执行程序名
    %(funcName)s: 打印日志的当前函数
    %(lineno)d: 打印日志的当前行号
    %(asctime)s: 打印日志的时间
    %(thread)d: 打印线程ID
    %(threadName)s: 打印线程名称
    %(process)d: 打印进程ID
    %(message)s: 打印日志信息
    
    • datefmt: 指定时间格式,同time.strftime()
    • level: 设置日志级别,默认为logging.WARNING
    • stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略
    import logging
    
    logging.basicConfig(level=logging.INFO,#默认为logging.WARNING
                        filename="outlog.log",#指定日志输出文件,
                        filemode="a",#和file函数意义相同,指定日志文件的打开式,'w'或'a'
                        datefmt='%Y-%m-%d %a %H:%M:%S',
                        # 指定输出的格式和内容,format可以输出很多有用信息
                        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
                        )
    
    # 声明了一个 Logger 对象,它就是日志输出的主类
    logger = logging.getLogger(__name__)
    
    logger.debug('debug message') # 调试的时候
    logger.info('info message')
    logger.warning('warning message')
    logger.error('error message')
    logger.critical('critical message') # 批判的
    

    三、同时将日志输出到屏幕和日志文件

    • 1、创建一个对象:
      logger = logging.getLogger()
    • 2、创建一个handler,用于写入日志文件:
      fh = logging.FileHandler('test.log',encoding='utf-8')
    • 3、或创建一个handler,用于输出到控制台 :
      ch = logging.StreamHandler()
    • 4、创建一个输出格式:
      fmt = logging.Formatter('%(asctime)s -%(filename)s- %(name)s - %(levelname)s - %(message)s')
    • 5、给文件操作符设置一个格式:
      fh.setFormatter(fmt)
    • 6、或给控制台设置一个格式:
      ch.setFormatter(fmt)
    • 7、给logger对象添加fh对象:
      logger.addHandler(fh) 或给logger对象添加ch对象:logger.addHandler(ch)
    import logging
    
    #声明了一个 Logger 对象,它就是日志输出的主类
    logger = logging.getLogger(__name__)
    # 设置日志级别
    logger.setLevel(logging.INFO)
    # 创建一个handler,用于写入日志文件
    fh = logging.FileHandler(filename="outlog.log",encoding="utf-8")
    # 创建一个handler,用于输出到控制台
    sh = logging.StreamHandler()
    # 创建一个输出格式
    fmt = logging.Formatter('%(asctime)s -%(filename)s- %(name)s - %(levelname)s - %(message)s')
    # 文件操作符设置一个格式
    fh.setFormatter(fmt=fmt)
    #给控制台设置一个格式
    sh.setFormatter(fmt=fmt)
    
    # 给logger对象添加fh和sh对象
    logger.addHandler(fh)
    logger.addHandler(sh)
    
    logger.debug('debug message') # 调试的时候
    logger.info('info message')
    logger.warning('warning message')
    logger.error('error message')
    logger.critical('critical message') # 批判的
    

    四、通过配置文件方式使用logging模块

    logger.conf配置文件

    [loggers]
    # 定义logger模块,root是父类,必需存在的,其它的是自定义。
    keys=root,infoLogger,errorlogger
    
    # 实现上面定义的loggers模块,必需是[logger_xxxx]这样的形式
    [logger_root]
    
    # level级别,级别有DEBUG、INFO、WARNING、ERROR、CRITICAL
    level=DEBUG
    
    # handlers 处理类,可以有多个,用逗号分开
    handlers=infohandler,errorhandler
    
    [logger_infoLogger]
    # handlers 处理类
    handlers=infohandler
    
    # qualname  logger名称,应用程序通过 logging.getLogger获取。
    # 对于不能获取的名称,则记录到root模块。
    qualname=infoLogger
    
    # propagate 是否继承父类的log信息,0:否 1:是
    propagate=0
    
    [logger_errorlogger]
    handlers=errorhandler
    qualname=errorlogger
    propagate=0
    
    ###############################################
    
    [handlers]
    keys=infohandler,errorhandler
    
    [handler_infohandler]
    # 日志处理类,控制台输出类
    class=StreamHandler
    # 日志级别
    level=INFO
    # 设定日志格式
    formatter=form02
    # args handler初始化函数参数
    args=(sys.stdout,)
    
    [handler_errorhandler]
    # 日志处理类,文件输出类
    class=FileHandler
    # 日志级别
    level=ERROR
    # 设定日志格式
    formatter=form01
    # args handler初始化函数参数,日志存放路径
    args=('logging/outlog.log', 'a')
    
    ###############################################
    
    [formatters]
    keys=form01,form02
    
    [formatter_form01]
    format=%(asctime)s %(filename)s %(levelname)s  %(message)s
    datefmt=%Y-%m-%d %H:%M:%S
    
    [formatter_form02]
    format=%(asctime)s %(filename)s %(levelname)s  %(message)s
    datefmt=%Y-%m-%d %H:%M:%S
    

    使用方式:

    from logging.config import fileConfig
    import logging
    
    fileConfig('logger.conf') # 加载自定义的配置文件
    logger=logging.getLogger('infoLogger') # 获得对应的日志对象
    logger.info('test1') #输出对应的日志
    logger_error=logging.getLogger('errorhandler')  #获的对应的日志对象
    logger_error.error('test5') # 输出对应的日志
    

    使用这种方式配置日志,一定要在项目的入口函数中就调用 logging.config.fileConfig("logging.conf")函数,因为 logging.conf 文件中,在handler中配置的是日志文件的相对地址,如果在其他代码文件中进行调用,由于相对地址的原因,将导致日志文件会出现在意想不到的位置。

    进行以上配置后,在项目中需要进行日志输出的地方通过logging.getLogger()方式就可以获取到对应的logger,然后就可以使用logger.info("xxx")进行日志输出了。

    相关文章

      网友评论

          本文标题:Python之日志记录模块logging

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