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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM