zoukankan      html  css  js  c++  java
  • 【python】多个文件共用日志系统的重复打印问题

    先写一个最简单的log文件: test_logging5.py

    #coding:utf-8
    import logging
    
    logging.debug('logger debug message')
    logging.info('logger info message')
    logging.warning('logger warning message')
    logging.error('logger error message')
    logging.critical('logger critical message')

    控制台输出结果:

    WARNING:root:logger warning message
    ERROR:root:logger error message
    CRITICAL:root:logger critical message

    再写个复杂点的,有名字的log文件:test_logging4.py

    #coding:utf-8
    import logging
    
    logger1 = logging.getLogger('mylogger')
    logger1.setLevel(logging.DEBUG)
    # 创建一个handler,用于写入日志文件  
    fh = logging.FileHandler('./log/test.log')
    # 再创建一个handler,用于输出到控制台  
    ch = logging.StreamHandler()
    # 定义handler的输出格式formatter  
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
    
    logger1.addHandler(fh)
    logger1.addHandler(ch)
    
    logger1.debug('logger1 debug message')
    logger1.info('logger1 info message')
    logger1.warning('logger1 warning message')
    logger1.error('logger1 error message')
    logger1.critical('logger1 critical message')

    文件和控制台的输出结果:

    2015-12-30 02:25:53,866 - mylogger - DEBUG - logger1 debug message
    2015-12-30 02:25:53,866 - mylogger - INFO - logger1 info message
    2015-12-30 02:25:53,866 - mylogger - WARNING - logger1 warning message
    2015-12-30 02:25:53,866 - mylogger - ERROR - logger1 error message
    2015-12-30 02:25:53,866 - mylogger - CRITICAL - logger1 critical message

    恩,看着也挺正常的。

    接着,我们把test_logging4.py中加上一句 import test_logging5.py

    #coding:utf-8
    import logging
    import test_logging5
    
    logger1 = logging.getLogger('mylogger')
    logger1.setLevel(logging.DEBUG)
    # 创建一个handler,用于写入日志文件  
    fh = logging.FileHandler('./log/test.log')
    # 再创建一个handler,用于输出到控制台  
    ch = logging.StreamHandler()
    # 定义handler的输出格式formatter  
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
    
    logger1.addHandler(fh)
    logger1.addHandler(ch)
    
    logger1.debug('logger1 debug message')
    logger1.info('logger1 info message')
    logger1.warning('logger1 warning message')
    logger1.error('logger1 error message')
    logger1.critical('logger1 critical message')

    文件中的结果跟上面的一样,但是控制台中的结果变成了:

    WARNING:root:logger warning message
    ERROR:root:logger error message
    CRITICAL:root:logger critical message
    2015-12-30 02:44:53,224 - mylogger - DEBUG - logger1 debug message
    DEBUG:mylogger:logger1 debug message
    2015-12-30 02:44:53,225 - mylogger - INFO - logger1 info message
    INFO:mylogger:logger1 info message
    2015-12-30 02:44:53,225 - mylogger - WARNING - logger1 warning message
    WARNING:mylogger:logger1 warning message
    2015-12-30 02:44:53,225 - mylogger - ERROR - logger1 error message
    ERROR:mylogger:logger1 error message
    2015-12-30 02:44:53,225 - mylogger - CRITICAL - logger1 critical message
    CRITICAL:mylogger:logger1 critical message

    分析一下:

    最前面的那3条是test_logging5.py执行后的结果

    但是,后面mylogger的打印却出现了两次,分别以我们设置的格式和默认的root格式打印了一遍。

    这说明不同文件间的log系统是相互影响的,在test_logging5.py中我们用到了默认的log,在test_logging4.py中就会认为有root log的存在,并由于日志间的继承关系导致root和mylogger都各自打印一遍日志。简言之,就是先打开的文件中对log的设置,后打开的文件都会受到影响

    那么,我们想让mylogger的内容只打印一遍怎么办呢?

    方法是,把test_logging5.py中的logger加个名字,不要用默认的root logger

    把test_logging5.py改成

    #coding:utf-8
    import logging
    
    logger2 = logging.getLogger('mylogger2') 
    ch = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    ch.setFormatter(formatter)
    logger2.addHandler(ch)
    
    
    logger2.debug('logger debug message')
    logger2.info('logger info message')
    logger2.warning('logger warning message')
    logger2.error('logger error message')
    logger2.critical('logger critical message')

    之后再运行test_logging4.py。结果就成了:

    2015-12-30 03:06:30,566 - mylogger2 - WARNING - logger warning message
    2015-12-30 03:06:30,566 - mylogger2 - ERROR - logger error message
    2015-12-30 03:06:30,566 - mylogger2 - CRITICAL - logger critical message
    2015-12-30 03:06:30,566 - mylogger - DEBUG - logger1 debug message
    2015-12-30 03:06:30,566 - mylogger - INFO - logger1 info message
    2015-12-30 03:06:30,567 - mylogger - WARNING - logger1 warning message
    2015-12-30 03:06:30,567 - mylogger - ERROR - logger1 error message
    2015-12-30 03:06:30,567 - mylogger - CRITICAL - logger1 critical message

    看,符合预期了~

    建议:在有多个相互关联的文件都需要用到python的日志系统时,不要用默认的root logger。因为所有的名称都会继承root导致重复打印。用logger时一定要起名字!!

  • 相关阅读:
    团队开发之个人博客三
    团队开发之个人博客二
    团队开发之个人博客一
    第六周进度条
    四则运算(Android)版
    第五周学习进度条
    第二冲刺周期个人报告01
    查找水王01
    构建之法阅读笔记09
    构建之法阅读笔记08
  • 原文地址:https://www.cnblogs.com/dplearning/p/5088074.html
Copyright © 2011-2022 走看看