zoukankan      html  css  js  c++  java
  • logging模块

    介绍

    Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式

    logging模块与log4j的机制是一样的,只是具体的实现细节不同。模块提供logger,handler,filter,formatter。
    
    logger:提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。
    
    handler:将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。
    
    filter:提供一种优雅的方式决定一个日志记录是否发送到handler。
    
    formatter:指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。
    
    与log4j类似,logger,handler和日志消息的调用可以有具体的日志级别(Level),只有在日志消息的级别大于logger和handler的级别。
    

    功能

    1. 日志格式的规范
    2. 操作的简化
    3. 日志的分级
    

    logger 模块不能做这些事情

    • 自动生成你要打印的内容

      这个需要程序员在开发的时候定义好


    使用


    basicConfig


    日志级别

    import logging
    
    logging.debug('debug message')  # 调试模式
    logging.info('info message')   # 基础信息模式
    logging.warning('warning message')  # 警告
    logging.error('error message')   # 错误
    logging.critical('critical message')  # 严重错误
    

    输出结果

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

    logging模块默认会输出warning, error, critical 这三个级别, debug, info级别默认不输出


    需求

    1. 希望所有日志级别都显示

    logging.basicConfig(level=logging.DEBUG)

    import logging
    
    logging.basicConfig(level=logging.DEBUG)
    logging.debug('debug message')  # 调试模式
    logging.info('info message')   # 基础信息模式
    logging.warning('warning message')  # 警告
    logging.error('error message')   # 错误
    logging.critical('critical message')  # 严重错误
    

    输出结果

    DEBUG:root:debug message
    INFO:root:info message
    WARNING:root:warning message
    ERROR:root:error message
    CRITICAL:root:critical message
    

    2. 将日志输出到文件

    import logging
    
    logging.basicConfig(level=logging.DEBUG, filename='debug.log')
    logging.debug('debug message')  # 调试模式
    logging.info('info message')   # 基础信息模式
    logging.warning('warning message')  # 警告
    logging.error('error message')   # 错误
    logging.critical('critical message')  # 严重错误
    

    输出结果


    3. 使得日志的输出格式有时间日期的显示

    import logging
    
    file_handler = logging.FileHandler(filename='debug.log', mode='w', encoding='utf-8', )
    logging.basicConfig(
        level=logging.DEBUG,
        format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
        handlers=[file_handler,],
    )
    
    logging.debug('debug message')  # 调试模式
    logging.info('info message')  # 基础信息模式
    logging.warning('warning message')  # 警告
    logging.error('error message')  # 错误
    logging.critical('critical message')  # 严重错误
    

    输出结果


    4. 日志切割

    import time
    import logging
    from logging import handlers
    from concurrent.futures.thread import ThreadPoolExecutor
    
    executor = ThreadPoolExecutor(max_workers=20)
    
    sh = logging.StreamHandler()  # 控制台日志
    
    # 将日志消息发送到磁盘,并支持日志文件按大小切割
    rh = handlers.RotatingFileHandler('myapp.log', maxBytes=1024, backupCount=5)
    
    # 将日志消息发送到磁盘文件,并支持日志文件按时间切割
    fh = handlers.TimedRotatingFileHandler(filename='x2.log', when='s', interval=5, encoding='utf-8')
    logging.basicConfig(
        format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
        handlers=[fh, sh, rh],
        level=logging.ERROR
    )
    
    
    def Test():
        for i in range(1, 100):
            time.sleep(1)
            logging.error('KeyboardInterrupt error %s' % str(i))
    
    task = executor.submit(Test)
    

    配置参数

    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对象配置


    第一步: 创建logger对象

    import logging
    
    logger = logging.getLogger()
    logger.setLevel(level=logging.DEBUG)   # 设定日志显示的级别
    

    第二步: 创建文件管理操作符/屏幕管理操作符

    fh = logging.FileHandler('debug.log', mode='a', encoding='utf-8')
    sh = logging.StreamHandler()
    

    第三步: 创建一个日志输出的格式

    format1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s')
    

    第四步: 文件管理操作符/屏幕管理操作符绑定一个日志输出的格式

    fh.setFormatter(format1)
    sh.setFormatter(format1)
    

    第五步: logger对象绑定文件管理操作符/屏幕管理操作符

    logger.addHandler(fh)
    logger.addHandler(sh)
    

    博客推荐

    https://www.jianshu.com/p/6dffc9a823d9

  • 相关阅读:
    今天面试一些程序员(新,老)手的体会
    UVA 10635 Prince and Princess
    poj 2240 Arbitrage
    poj 2253 Frogger
    poj 2485 Highways
    UVA 11258 String Partition
    UVA 11151 Longest Palindrome
    poj 1125 Stockbroker Grapevine
    poj 1789 Truck History
    poj 3259 Wormholes
  • 原文地址:https://www.cnblogs.com/cjwnb/p/11851787.html
Copyright © 2011-2022 走看看