• python模块--logging模块


     logging模块

    日志级别:debug<info<warning<error<critical

    # 默认日志级别为warning

    简单将日志打印到屏幕
    >>> logging.debug('test debug')
    >>> logging.info('test info')
    >>> logging.warning('test warning')  
    WARNING:root:test warning
    >>> logging.error('test error')
    ERROR:root:test error
    >>> logging.critical('test critical')
    CRITICAL:root:test critical

    通过logging.basicConfig()方法 自定义日志输入位置,日志格式,级别等

    logging.basicConfig()可通过具体参数来更改logging模块默认行为,参数:
    
    filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
    filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    format:指定handler使用的日志显示格式。
    datefmt:指定日期时间格式。format 参数中有 asctime 的话,需要使用 datefmt 指定格式
    level:设置rootlogger(后边会讲解具体概念)的日志级别
    stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。
    
    
    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用户输出的消息 
    #日志输入到屏幕
    import logging
    logging.basicConfig(
                        level=logging.WARNING,
                        format='%(asctime)s 【%(name)s】 %(filename)s %(levelname)s  %(message)s ', 
                        datefmt = "%Y/%m/%d %H:%M:%S",
                        )
    logger = logging.getLogger(__name__)    #format里面的name打印的就是这里定义的Logger
    logger.info('test info')
    logger.warning('test warning')
    logger.error('test error')
    #控制台结果:
    2018/11/28 18:04:25 【__main__】 test.py WARNING  test warning 
    2018/11/28 18:04:25 【__main__】 test.py ERROR  test error 
    
    # 把日志输入到文件
    import logging
    logging.basicConfig(filename='test.log',
                        filemode='w',
                        level=logging.WARNING,
                        format='%(asctime)s %(filename)s %(levelname)s  %(message)s ',
                        datefmt = "%Y/%m/%d %H:%M:%S",
                        )
    logging.info('test info')
    logging.warning('test warning')
    logging.error('test error')
    
    #结果:test.log:
    2018/11/28 16:05:19 test.py WARNING  test warning 
    2018/11/28 16:05:19 test.py ERROR  test error 
    • logger 提供应用程序可以调用的接口
    • handler 把logger创建的日志输出到合适的目标
    • filter 过滤 选择什么日志应该输出
    • formatter 指定日志输出格式

    把日志同时输出到屏幕和文件里 

    # 步骤:
    • 创建logger
    • 创建handler
    • 定义formatter
    • 给handler添加formatter
    • 给logger添加handler
    import logging
    #创建logger
    logger = logging.getLogger("LOGGER")
    logger.setLevel(logging.WARNING)   #可以在logger或者hanndler设置日志级别。全谁的level高就使用谁的
    #创建一个handler(输出到控制台的)
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)    #被全局覆盖
    #创建一个handler(输出到文件的)
    file_handler = logging.FileHandler('test.log')
    file_handler.setLevel(logging.ERROR)    # 没有被覆盖
    
    #创建formatter
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
    #给handler添加Formatter
    console_handler.setFormatter(formatter)
    file_handler.setFormatter(formatter)
    
    # 给logger添加handler
    logger.addHandler(console_handler)
    logger.addHandler(file_handler)
    
    logger.debug('test debug')
    logger.info('test info')
    logger.warning('test warning')
    logger.error('test error')
    logger.critical('test critical')

    handler

    StreamHandler  日志输出到流,可以是sys.stderr,sys.stdout或者文件

    #日志信息会输出到指定的stream中,如果stream为空则默认输出到sys.stderr。
    class logging.StreamHandler(stream=None)  

    FileHandler    日志输出到文件

    class logging.FileHandler(filename,mode ='a',encoding = None,delay = False )
    #模式默认为append,delay为true时,文件直到emit方法被执行才会打开。默认情况下,日志文件可以无限增大

    BaseRotatingHandler  基本的日志切割方式,RotatingFileHandler和TimeRotatingHandler两个类继承此类

    RotatingFileHandler  日志输出到文件,并且当文件达到一定大小时,会产生新文件

    class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)
    #参数maxBytes和backupCount, 当日志文件size大于等于maxBytes时,就会新创建一个日志文件。backupcount是文件数目。
    例如maxBytes=1024,backupCount=3时,
    日志app.log如果达到1024,则会产生另外三个文件app.log.1,app.log.2,app.log.3。当这两个参数中间任一个为0时,都不会发生rollover

    TimeRotatingHandler  日志rollover方式,间隔一段时间就自动创建新的文件

    logging.handlers.TimedRotatingFileHandler(filename,when='h',interval=1,backupCount=0,encoding=No,nedelay=False,utc=False,atTime=None)
    # when参数可以指定时间间隔的单位,不区分大小写。
    S 秒
    M 分
    H 小时
    D 天
    'W0'-'W6' 星期 ('W0'星期一,...'W6'星期天)
    midnight 每天凌晨
    # interval 指定时间间隔

    SocketHandler  远程输出日志到TCP/IP sockets

    DatagramHandler  远程输出日志到UDP sockets

    SMTPHandler  远程输出日志到邮件地址

    SysLogHandler  日志输出到syslog

    NTEventLogHandler   远程输出日志到Windows NT/2000/XP的事件日志

    MemoryHandler   日志输出到内存中的指定buffer

    HTTPHandler   通过"GET"或者"POST"远程输出到HTTP服务器

    以字典的方式配置

    使用 logging.config模块

    把字典传给logging.config.dictConfig():    logging.config.dictConfig(DIC_CONFIG)

    字典配置
    必须包含的键:
    version  目前唯一有效值为1
    可选的键有:
    formatters   
    filters 
    handlers:  class(必选)
                level(可选)
                formatter(可选)
                filters(可选)
    
    loggers:  level(可选)   
              propagate(可选)   
              filters(可选)
              handlers(可选)
             
    root: root logger配置,配置和logger配置一样,但是没有propagate配置不适用
    incremental:  默认False。如果为True,表示增量配置
    disable_existing_loggers:  默认为True。是否要禁用现有的logger

    示例:

    import logging.config
    DIC_CONFIG = {
        "version":1,
        #设置formatter
        "formatters":{
            "simple":{
                "format":"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
            },
            "standard":{
                "format":"%(asctime)s - %(threadName)s:%(thread)s - %(name)s - %(filename)s -  %(levelname)s - %(message)s"
            }
        },
        "handlers":{
            #打印到终端的handler
            "console":{
                "class":"logging.StreamHandler",     #输出到屏幕的handler类型
                "level":"DEBUG",
                "formatter":"simple",    #给handler添加formatter
            },
            #打印到文件的handler
            "file_handler":{
                "class":"logging.handlers.RotatingFileHandler",  #输出到文件的handler类型
                "level":"INFO",
                "formatter":"standard",    #给handler添加formatter
                "filename":"access.log",
                "maxBytes":1024*1024*8,  #当文件大于等于这个值时,产生3个文件
                "backupCount":3,
                "encoding":"utf8"
            },
            #错误日志输出到另一个文件
            "error_file_handler":{
                "class":"logging.handlers.RotatingFileHandler",
                "level":"ERROR",
                "formatter":"standard",
                "filename":"errors.log",
                "maxBytes":1024*1024*3,
                "backupCount":3,
                "encoding":"utf8"
            }
        },
        "loggers":{
            "my_logger":{
                "level":"DEBUG",
                "handlers":["console","file_handler","error_file_handler"],   #将handler添加到logger
                "propagate":True
            }
        },
        "root":{  #可以不写
            "level":"INFO",
            "handlers":["console","file_handler","error_file_handler"]
        },
        "disable_existing_loggers":False, #不禁用现有的loggers
    }
    
    logging.config.dictConfig(DIC_CONFIG)
    logger = logging.getLogger(__name__) # 生成一个log实例 logging.info(
    "hi")
  • 相关阅读:
    3.0.35 platform 设备资源和数据
    老子《道德经》第六十三章
    linux spi 主机与外设分离思想
    3.0.35 platform 总线、设备与驱动
    Linux 内核SPI子系统架构
    C 显示一个字符的编码值
    JAVA高级特性--内部类
    Java面向对象----接口概念
    Java面向对象----抽象类
    Java面向对象----多态概念,对象上下转型
  • 原文地址:https://www.cnblogs.com/xiaobaozi-95/p/9958872.html
Copyright © 2020-2023  润新知