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')
  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/xia-dong/p/11833563.html
Copyright © 2011-2022 走看看