• python--6、logging模块


    logging

    可用的日志级别:

    • debug 10
    • info 20
    • warning 30
    • error 40
    • critical 50

    logging默认参数:

    • 默认日志级别是warning。
    • 默认情况日志输出到终端。
    • 默认日志名是root,即默认root产生日志。

    简单使用:

    import logging
    logging.info('info level')

    logging的全局配置方式:basicconfig

    修改logging模块的默认日志格式。
    filename - 指定日志的存储位置。
    filemode - 指定文件打开模式。默认'a'
    format - 定义日志的格式。
    datafmt - 指定日期格式。
    level - 定义日志级别,写级别对应的数字。

    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(
        filename='test.log'
        format='%(asctime)s - %(name)s -  - %(levelname)s -%(module)s:  %(message)s',
        level=30,
        datefmt='%Y-%m-%D %X'
    )
    logging.error('error level')

    缺点:

    • 不能同时输出到文件和终端。
    • 不能多种输出环境的级别、格式的自定义。

    logging模块的四种对象

    Formatter

    定义不同的日志格式对象,然后绑定给不同的Handler。以此来控制不同Handler的日志格式。

    Handler

    负责接收日志并控制打印到不同地方。一个Handler对象可以绑定一种日志格式。
    FileHandler - 打印到文件。
    StreamHandler - 打印到终端。

    Logger

    负责产生日志的对象,getLogger()方法实例化后的对象。对应日志的masage字段。

    Filter

    负责过滤日志的对象。目测没啥用

    logging应用

    import logging
    #logger对象,负责产生日志信息
    logger = logger.getLogger('root')
    
    #filter对象,没用
    
    #Handler对象:接受log传来的日志内容,控制打印到终端or文件。
    Handler1 = logging.FileHandler('tset1.log')
    Handler2 = logging.StreamHandler()
    
    #formatter对象
    formatter1 = logging.Formatter('%(asctime)s - %(name)s -  - %(levelname)s -%(module)s:  %(message)s',
    datafmt='%Y-%m-%d %H:%M:%S',)
    formatter2 = logging.Formatter('%(asctime)s  %(name)s  %(message)s',)
    
    #把日志格式绑定到不同输出对象。
    Handler1.setFormatter(formatter1)
    Handler2.setFormatter(formatter2)
    
    #设置日志输出级别
    Handler1.setLevel(10)
    
    #设置日志产生的级别
    logger.setLevel(10)
    
    #把日志信息绑定到Handler来输出。
    logger.addHandler(Handler1)
    
    #测试。
    logger.info('info level')

    logger与Handler定义级别时的关键

    logger是第一级别过滤,然后日志才会到Handler,需给logger和Handler同时设置level,但要注意:

    在所有logger传的日志都要输出时,必须有如下的要求:

    内容级别 >= logger对象的日志级别必须 >= Handler对象的日志级别。

    logger的继承——只需知道有这么个玩意

    import logging
    formatter=logging.Formatter('%(asctime)s - %(name)s -%(module)s:  %(message)s',)
    
    inherit=logging.StreamHandler()
    inherit.setFormatter(formatter)
    
    logger1=logging.getLogger('root')
    logger2=logging.getLogger('root.child1')
    
    logger1.addHandler(inherit)
    logger2.addHandler(inherit)
    
    logger1.setLevel(10)
    logger2.setLevel(10)
    
    logger1.debug('log1 debug')
    logger2.debug('log2 debug')

    ★生产环境中的应用方法

    配置

    "logging配置"
    import os,logging.config
    
    #先定义两种日志输出格式
    standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
                      '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
    
    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    
    #定义日志输出格式
    logfile_dir = os.path.dirname(os.path.abspath(__file__))
    logfile_name = 'production.log'
    
    if not os.path.isdir(logfile_dir)
        os.mkdir(logfile_dir)
        
    #log文件全路径
    logfile_path = os.path.join(logfile_dir,logfile_name)
    
    #log配置字典
    LOGGING_DIC = {
        'version':1,
        'disable_existing_loggers':False,
        'formatters': {
            'standard': {
                'format': standard_format
            },
            'simple': {
                'format': simple_format
            },
        },
        'filters': {},
        'handlers': {
            #打印到终端
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
                'formatter': 'simple'
            },
            #打印到文件
            'default': {
                'level': 'DEBUG',
                'class': 'logging.handlers.RotatingFileHandler',
                'formatter': 'standard',
                'filename': logfile_path,
                'maxBytes': 1024*1024*6,
                'encoding': 'utf-8',
            },
        },
        'loggers': {
            #logging.getLogger(__name__)时拿到的配置
            '': {
                #把上面定义的两个Handler加到这里,log即写入文件又打到终端。
                'handlers': ['default','console'],
                'level': 'DEBUG',
                #向上(更高level的logging)传递
                'propagate': True,
            },
        },
    }
    def load_my_logging_cfg():
        logging.config.dictConfig(LOGGING_DIC)
        #生成个log实例,__name__即把当前模块名传进去,找不到日志相关配置,使用''这个默认的。
        logger = logging.getLogger(__name__)

    使用:

    "MyLogging Test"
    
    import time
    import logging
    import my_logging  # 导入自定义的logging配置
    
    logger = logging.getLogger(__name__)  # 生成logger实例
    
    
    def demo():
        logger.debug("start range... time:{}".format(time.time()))
        logger.info("中文测试开始。。。")
        for i in range(10):
            logger.debug("i:{}".format(i))
            time.sleep(0.2)
        else:
            logger.debug("over range... time:{}".format(time.time()))
        logger.info("中文测试结束。。。")
    
    if __name__ == "__main__":
        my_logging.load_my_logging_cfg()  # 在你程序文件的入口加载自定义logging配置
        demo()
  • 相关阅读:
    0_Simple__simplePrintf
    0_Simple__simplePitchLinearTexture
    0_Simple__simpleP2P
    0_Simple__simpleOccupancy
    0_Simple__MultiGPU
    0_Simple__simpleMultiCopy
    0_Simple__simpleMPI
    0_Simple__simpleLayeredTexture
    0_Simple__simpleCubemapTexture
    0_Simple__simpleCooperativeGroups
  • 原文地址:https://www.cnblogs.com/jinyudong/p/7719776.html
Copyright © 2020-2023  润新知