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时一定要起名字!!

  • 相关阅读:
    HDU Railroad (记忆化)
    HDU 1227 Fast Food
    HDU 3008 Warcraft
    asp vbscript 检测客户端浏览器和操作系统(也可以易于升级到ASP.NET)
    Csharp 讀取大文本文件數據到DataTable中,大批量插入到數據庫中
    csharp 在万年历中计算显示农历日子出错
    csharp create ICS file extension
    CSS DIV Shadow
    DataTable search keyword
    User select fontface/color/size/backgroundColor设置 字体,颜色,大小,背景色兼容主流浏览器
  • 原文地址:https://www.cnblogs.com/dplearning/p/5088074.html
Copyright © 2011-2022 走看看