2012-02-13 1 views
4

私はPythonのコンポーネントやダースなどの構成ファイルを中心にloggingというコードを書いています。UNIXの時刻形式(ミリ秒または分数のいずれかでどちらも良いです)で時刻を記録するには特定のロガーが必要です。設定ファイル経由でPythonロギングフォーマッタを設定してUnixのタイムスタンプとして時刻を記録する方法はありますか?

設定ファイルにフォーマッタを設定して、%(asctime)sのような出力をする方法はありますか?私は、複数の独立したPythonスクリプトでFormatterインスタンスをモンキーパッチする必要を避けようとしています。ログファイルを後処理することは不可能です。

関連:Python logging: override log time

答えて

5

ただ、例えば、あなたの対応フォーマッタconfigセクションやフォーマッタコンストラクタ呼び出しに

datefmt = %s 

を追加:

[formatter_generic] 
format = %(asctime)s %(levelname)-5.5s [%(name)s] %(message)s 
datefmt = %s 

も参照してくださいlogging.Formatterコンストラクタとstrftime(3)

+0

あなたが実際にこれを試したことがありますか?私はそれがうまくいくように見えますが、小さな '%s'を使うと' ValueError:Invalid format string'(唯一)が出ます。 – Irfy

+0

はい、私のために完全に動作します。最小限の作業例はこちらをご覧ください:https://gist.github.com/1819970 – abbot

+0

Bah。 'time.strftime'はWindowsで説明したように失敗し、Linux上であなたの解決策を確認することができました。明らかに、Pythonのstrftimeは '%s'を持っていないと[文書化されています](http://docs.python.org/library/time.html#time.strftime)ので、実際には文書化されていないプラットフォーム固有の機能です。 – Irfy

0

私は、次の解決策を見つけた:

import logging 

class UnixTimeStampFormatter(logging.Formatter): 
    def formatTime(self, record, datefmt = None): 
     return "{0:.6f}".format(record.created) 

def main(): 
    logChannel = logging.StreamHandler() 
    logChannel.setFormatter(UnixTimeStampFormatter("%(asctime)s %(levelname)-5.5s [%(name)s] %(message)s")) 
    logging.getLogger().setLevel(logging.DEBUG) 
    logging.getLogger().addHandler(logChannel) 
    logging.debug('hello'); 

if __name__ == "__main__": 
    main() 
+0

私はこのようなことを避けようとしていました。なぜなら、尋ねられた様式で時間を記録する必要のある多くの独立したコードなし共有スクリプトがあるからです。 – Irfy