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

    I.日志级别

    低到高分别为:

    (1)DEBUG:输出详细的运行情况,主要用于调试---》debug()

    (2)INFO:确认一切按预期运行,一般用于输出重要运行情况---》info()

    (3)WARNING:一些意想不到的事情发生了(比如:警告),但是这个软件还能按预期工作 ---》warning()

    (4)ERROR:发生了错误,软件没能执行一些功能,还可以继续执行 ---》error()

    (5)CRITICAL:一个严重的错误,表名程序本身可能无法继续运行 ---》ctritical()

    注意:logging模块默认收集的日志:warning以上等级

    II.日志原理

    py文件中记录日志 ---收集日志---》日志收集器---输出日志---》控制台/文件

    III.写日志过程

    (1)创建一个收集器,名称自定义: logger = logging.getLogger('name')

    (2)设置日志收集器的等级: logger.setLevel(LEVEL)

    (3)输出到日志

    • 创建一个输出渠道
      • 输出到日志文件
    fh = logging.FileHandler(LOG_PATH ,encoding='utf-8')  # 输出模式默认a(追加)
      • 输出到控制台
    sh = logging.StreamHandler()
    • 设置输出级别:fh.setLevel(FHLEVEL) 或 sh.setLevel(SHLEVEL)

    (4)设置输出格式

    formatter =  logging.Formatter('%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s') # 时间-文件名-行号-日志级别-输出信息 

    详细说明:

    %(name)s 收集器名称
    %(levelno)s 打印日志级别的数值【数字形式】
    %(levelname)s 打印日志级别名称【文本形式】
    %(pathname)s 打印当前执行程序的路径,其实就是sys.argv[0]
    %(filename)s 打印当前执行程序名
    %(module)s 打印当前模块名
    %(lineno)d 打印日志输出函数的语句所在的代码行
    %(funcName)s 打印日志当前函数名
    %(thread)d 打印线程ID
    %(threadName)s 打印线程名称
    %(process)d 打印进程ID
    %(message)s 打印日志信息
    %(name)s Logger的名字
    %(created)f 当前时间,用unix标准表示时间的浮点数表示
    %(relativeCreated)d 输出日志信息时,自Logger创建的毫秒数
    %(asctime)s 字符串形式的当前时间,默认格式为"年-月-日 时:分:秒,毫秒"

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    (5)收集器对接输出渠道,并格式化

    #输出到日志文件
    logger.addHandler(fh)
    fh.setFormatter(formatter)
    
    #输出到控制台
    logger.addHandler(sh)
    sh.setFormatter(formatter)

    (6)收集日志

      if level == 'DEBUG':
                logger.debug(msg)
            elif level == 'ERROR':
                logger.error(msg)
            elif level == 'INFO':
                logger.info(msg)
            elif level == 'WARNING':
                logger.warning(msg)
            elif level == 'CRITICAL':
                logger.critical(msg)

    (7)关闭日志渠道

     logger.removeHandler(fh)
     logger.removeHandler(sh)

    日志文件完整代码

    import os
    import time
    import logging
    from logging.handlers import TimedRotatingFileHandler,RotatingFileHandler # 日志轮转
    from com.contants import LOG_DIR # 日志文件路径
    from com.myconf import conf # 配置文件对象
    
    
    log_path = os.path.join(LOG_DIR,'log' + time.strftime('%Y-%m-%d') +'.log') # 输出日志文件名称
    
    class MyLogger(object):
    
        @staticmethod
        def get_log():
        # 1. 定义一个日志收集器,默认名称为root
            logger = logging.getLogger()
        # 2. 设置日志收集器的等级
            logger.setLevel(conf.get('logging', 'level'))
        # 3. 输出到日志
        # (1) 创建一个输出到日志文件的输出渠道
            fh = logging.FileHandler(log_path ,encoding='utf-8')
            """
       
        #  按文件大小进行轮转,保留最新的日志信息
            fh = RotatingFileHandler(filename= 'test.logs',
                                     maxBytes =1024*1024, # 设置文件大小:字节--1MB = 1024*1024byte
                                     backupCount= 3 ) # 轮转的文件数量
        # 按时间进行轮转
            fh = TimedRotatingFileHandler(filename='test.logs',
                                          encoding='utf8',
                                          when='D', # D:表示天
                                          interval = 1, # 时间间隔
                                          backupCount=30) # 轮转的文件数量
            """
    
        # (2) 设置输出级别
            fh.setLevel(conf.get('logging', 'fhlevel'))
        # 4. 输出到控制台
        # (1) 创建一个输出到控制台的输出渠道
            sh = logging.StreamHandler()
        # (2) 设置输出级别
            sh.setLevel(conf.get('logging', 'shlevel'))
        # 5. 设置输出格式
            formatter =  logging.Formatter('%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s')
        # 6. 收集器对接输出渠道,并格式化
            logger.addHandler(fh)
            fh.setFormatter(formatter)
    
            logger.addHandler(sh)
            sh.setFormatter(formatter)
            return logger
    
    # 调用类的静态方法,创建一个日志收集器
    my_log = MyLogger.get_log()
  • 相关阅读:
    平面划分问题
    First Missing Positive
    Redis.conf
    Redis内存存储结构分析
    IE9崩溃解决办法
    未能正确加载包"visla Studio HTM Editor Package"(GUID={1B437B20F8FE11D2A5AE00104BCC7269})
    SQL SERVER 数据类型详解
    创建TIff虚拟打印机
    VS2010出现错误the operation could not be completed
    C# 基础知识 20101118
  • 原文地址:https://www.cnblogs.com/kite123/p/13785471.html
Copyright © 2011-2022 走看看