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


    日志级别:
    Number Name
    50 CRITICAL
    40 ERROR
    30 WARNING(默认)
    20 INFO
    10 DEBUG
    **比设定的level低的level会被过滤掉,不打印

    输出格式:
    %(name)s 日志名称
    %(asctime)s 日志时间
    %(filename)s 文件名
    %(pathname)s 文件的全路径名
    %(funcName)s 函数名
    %(levelname)s 日志等级
    %(levelno)s 数字化日志等级
    %(lineno)d 行数
    %(module)s 模块名
    %(msecs)d 时间中毫秒部分
    %(process)d 进程ID
    %(processName)s 进程名
    %(thread)d 线程ID
    %(threadName)s 线程名

    一.基础basicConfig用法
    import logging
    logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    logger=logging.getLogger(__file__) #如果不给定参数,默认参数为root

    logger.info('this is a info message')
    logger.debug('this is a debug message')
    logger.error('this is a error message')

    *补充*
    basicConfig的参数:
    level:设置日志级别
    format:指定输出格式,如上面的输出格式
    filename:创建FileHandler,当这个参数使用后,不再使用StreamHandler
    filemode:文件写入方式,默认是a
    datefmt:设定时间日期格式,这个格式会覆盖format里面的asctime的格式
    stream:设定StreamHandler,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename参数同时指定时,stream会被忽略

    二.FileHandler,StreamHandler日志输出到屏幕和console

    import logging
    import time
    
    #create logger
    logger=logging.getLogger(__file__)
    logger.setLevel(logging.DEBUG)
    
    #create FileHandler
    filehandler=logging.FileHandler('a.log')
    filehandler.setLevel(logging.INFO)
    
    #create StreamFilehandler
    streamhandler=logging.StreamHandler()
    streamhandler.setLevel(logging.INFO)
    
    #Create formatter
    formatter=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    formatter.datefmt="%Y-%m-%d %H:%M:%S"
    
    filehandler.setFormatter(formatter)
    streamhandler.setFormatter(formatter)
    
    logger.addHandler(filehandler)
    logger.addHandler(streamhandler)
    
    
    logger.info('this is a info message')
    logger.debug('this is a debug message')
    logger.error('this is a error message')


    三.Config.ini文件来配置logging模块:

    Config.ini文件:

    ######################Formatters###################
    [formatters]
    keys=f1			#定义f1 formatter,可以定义多个,key=f1,f2,f3...
    
    [formatter_f1]		#注意格式是formatter_f1
    format=%(filename)s-%(levelname)s-%(message)s
    datefmt=%Y-%m-%d %H:%M:%S
    
    
    #####################Handlers######################
    [handlers]
    keys=h1,h2		#定义h1,h2两个handler,一个是FileHandler,一个是StreamHandler
    
    [handler_h1]		#注意格式handler_h1
    class=FileHandler
    args=('a.log','a')	
    level=INFO
    formatter=f1
    
    [handler_h2]		#注意格式handler_h2
    class=StreamHandler
    args=(sys.stdout,)	#注意sys.stdout后面的,号	
    level=INFO
    formatter=f1
    
    
    ###################loggers#######################
    [loggers]
    keys=root	#root是父类,是必须的,还可以自定义其它的,key=root,l1,l2...
    
    [logger_root]	#注意格式
    level=DEBUG
    handlers=h1,h2	#同时输出到console和文件
    import logging
    from logging.config import fileConfig
    
    fileConfig('logger_config.ini')
    logger1=logging.getLogger()
    logger1.info('this is a info message')

    四.yaml 文件配置logging模块

    logger.yaml:

    version: 1
    disable_existing_logger: False
    
    formatters:
        f1:
            format: "%(filename)s-%(levelname)s-%(message)s"
            datefmt: "%Y-%m-%d %H:%M:%S"
    
    
    handlers:
        h1:
            class: logging.StreamHandler
            level: INFO
            formatter: f1
            stream: ext://sys.stdout
    
        h2:
            class: logging.FileHandler
            level: INFO
            formatter: f1
            filename: 'a.log'
    
    
    
    loggers:
        l1:
            level: DEBUG
            handlers: [h1,h2]
            propagate: no
    
    root:
        level: INFO
        handlers: [h1,h2]
    import logging
    import yaml
    from logging.config import dictConfig
    
    with open('logger.yaml','r') as f:
        config=yaml.safe_load(f)
    
    dictConfig(config)
    
    logger=logging.getLogger()
    logger.info('this is a info message')

    五.json文件配置logging模块

    logger.json:

    {
      "version": 1,
      "disable_existing_loggers": false,
    
      "formatters":{
        "f1":{
          "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
          "datefmt": "%Y-%m-%d %H:%M:%S"
        }
      },
    
      "handlers": {
        "h1": {
          "class": "logging.FileHandler",
          "level": "INFO",
          "formatter": "f1",
          "filename": "a.log"
        },
        "h2": {
          "class": "logging.StreamHandler",
          "level": "INFO",
          "formatter": "f1",
          "stream": "ext://sys.stdout"
        }
      },
    
      "loggers":{
        "l1":{
          "level": "DEBUG",
          "handlers": [
            "h1",
            "h2"
          ]
        }
      },
    
      "root":{
        "level":"DEBUG",
        "handlers":["h1","h2"]
      }
    
    }
    import logging
    import json
    from logging.config import dictConfig
    
    with open('logger.json','r') as f:
        config=json.load(f)
    
    dictConfig(config)
    logger=logging.getLogger()
    logger.info('this is a info message')
  • 相关阅读:
    BZOJ 2006 [NOI2010]超级钢琴
    标准打印一棵树
    COJ 0288 路径(2015升级版)
    批判树套树。。。。。。。。
    BestCoder Round #49
    蓝牙通信中读取固定长度数组的解决
    5月5日的规划
    必须要改变这样的生活
    五一结束
    五一来临
  • 原文地址:https://www.cnblogs.com/xia-dong/p/11833563.html
Copyright © 2011-2022 走看看