2016-10-03 73 views
1

我有一個Python 3.4應用程序廣泛使用日誌記錄。我有兩個FileHandler和一個StreamHandler註冊。一切都按預期工作,除了有時,它似乎發生在requests庫引發異常之後,日誌文件會丟失所有累積的消息並以新消息開始。我假設由於某種原因FileHandlers重新打開mode='w'文件,但我不明白爲什麼。有任何想法嗎?爲什麼Python日誌框架會丟失消息?

主要程序設置記錄儀如下:

# Set up root logger - two handlers logging to files 
fh_debug = logging.FileHandler('Syncer.debug', mode='w', encoding='utf-8') 
fh_debug.setLevel(logging.DEBUG) 
fh_log = logging.FileHandler('Syncer.log', mode='w', encoding='utf-8') 
fh_log.setLevel(logging.INFO) 
fh_formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s' 
) 
fh_debug.setFormatter(fh_formatter) 
fh_log.setFormatter(fh_formatter) 
logging.getLogger().addHandler(fh_debug) 
logging.getLogger().addHandler(fh_log) 

# Add console handler with a higher log level 
ch = logging.StreamHandler() 
ch.setLevel(logging.INFO) 
ch_formatter = logging.Formatter('%(message)s') 
ch.setFormatter(ch_formatter) 
logging.getLogger().addHandler(ch) 

# Need to set the logging level of the logger as well as the handlers 
logging.getLogger().setLevel(logging.DEBUG) 

# Set up the logger for this module 
logger = logging.getLogger("Syncer") 

logger.debug('Logger started.') 

模塊只包含

logger = logging.getLogger(__name__) 
+0

做了像也許導入主文件用於其他目的是異常處理程序發生的呢?你可以保留一組文件(Syncer.debug.0,Syncer.debug.1等),以便你有更多的歷史。 – tdelaney

+0

我還沒有創建一個異常處理程序。一個快速解決方法是打開與模式='a'的文件。但是,理解發生的事情會很好。 –

回答

0

你的問題是,你選擇了錯誤的modeFileHandler

默認模式FileHandlera這意味着將新行添加到日誌文件。

類logging.FileHandler(文件名,模式= 'A',編碼=無,延遲=假)

您修改的默認模式到w其截斷文件長度爲零或創建一個新的寫作文件。這就是爲什麼你失去了所有積累的信息。

更改爲mode='a'或只是刪除mode='w'然後您的記錄器將工作。

閱讀official python docs here

+0

我完全期待日誌文件在應用程序啓動時被截斷。我沒有想到的是,在程序的單次運行中,日誌文件會「自發地」截斷。任何想法爲什麼會發生? –