2016-10-03 5 views
1

ロギングを広範囲に使用するPython 3.4アプリケーションがあります。私は2つのFileHandlerとStreamHandlerを登録しています。 requestsライブラリが例外をスローした後にログファイルが累積されたすべてのメッセージを失い、新しいメッセージで始まる場合があることを除いて、すべてが期待通りに動作します。何らかの理由でFileHandlersがファイルをmode='w'で再オープンしたと仮定していますが、理由はわかりません。何か案は?Pythonロギングフレームワークでメッセージが失われるのはなぜですか?

次のようにメインプログラムは、ロガーを設定します:モジュールは、単に

logger = logging.getLogger(__name__) 
+0

は、おそらくいくつかの他の目的のために、メインファイルをインポートするようにその例外ハンドラで何が起こるのか?読みますかより多くの履歴を持つように、一連のファイル(Syncer.debug.0、Syncer.debug.1など)を保持することができます。 – tdelaney

+0

私は例外ハンドラを作成していません。簡単な修正は、mode = 'a'でファイルを開くことです。しかし、何が起きているのかを理解することはうれしいことです。 –

答えて

0

を含ま

# 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.') 

あなたの問題は、あなたのFileHandlerのための間違ったmodeを選んだということです。

FileHandlerのデフォルトモードはaです。これは、ログファイルに新しい行を追加することを意味します。

クラスlogging.FileHandler(ファイル名、モード=「」、エンコーディング=なし、遅延= False)が

あなたはファイルを長さゼロに切り捨てるか、新しいを作成しているwにデフォルトモードを変更ファイルを書く。そのため、蓄積されたすべてのメッセージを失ったのです。

mode='a'に変更するか、mode='w'を削除すると、ロガーが機能します。

official python docs here

+0

アプリケーションを起動したときにログファイルが切り捨てられることを完全に予想していました。私が期待していなかったのは、ログファイルが "自発的に"切り詰められるプログラムの1回の実行を途中で止めることだった。それがどうして起こるのか? –

関連する問題