2012-01-04 53 views
11

ファイルからPythonログを設定しています(http://www.python.org/doc//current/library/logging.html#configuration-file-formatを参照)。Pythonロギング:ロギング設定ファイルの形式文字列で改行を表現する方法は?

そのページの例から、私は次のようになります設定ファイルのフォーマッタを持っている:

[formatter_form01] 
format=F1 %(asctime)s %(levelname)s %(message)s 
datefmt= 
class=logging.Formatter 

私はフォーマッタを指定し、「形式」の文字列に改行を入れてはどうすればよいですか? \nでも\\nでもありません(例:format=F1\n%(asctime)s %(levelname)s %(message)sは機能しません)。おかげで私の最善の策は、(代わりにlogging.Formatterの)カスタムフォーマッタを使用することでしょう

+5

ロギングの新しい行はありますか?しないでください。ログファイルはgrepするのが非常に困難です。 – fabrizioM

+0

@ fabrizioM本当ですが、この質問には関係ありません。 –

答えて

0

が...参考のため、ここではlogging.Formatter.formatのソースコードがあります:

def format(self, record): 
    record.message = record.getMessage() 
    if string.find(self._fmt,"%(asctime)") >= 0: 
     record.asctime = self.formatTime(record, self.datefmt) 
    s = self._fmt % record.__dict__ 
    if record.exc_info: 
     # Cache the traceback text to avoid converting it multiple times 
     # (it's constant anyway) 
     if not record.exc_text: 
      record.exc_text = self.formatException(record.exc_info) 
    if record.exc_text: 
     if s[-1:] != "\n": 
      s = s + "\n" 
     s = s + record.exc_text 
    return s 

それは私にはかなり明確ですself._fmtがテキストファイル(一行)から読み込まれた場合、どんな種類のエスケープも可能ではないということです。たぶん、あなたは、logging.Formatterから延びるこのメソッドをオーバーライドして、のようなもののための第四行を置き換えることができます:あなたは他のものも同様にエスケープしたい場合は、

s = self._fmt.replace('\\n', '\n') % record.__dict__ 

以上の一般的な何か。

EDIT:代わりに、のinitメソッドで(メッセージがフォーマットされるたびにではなく)1回行うことができます。 ConfigParserは複数の行をサポートしているため、このルートに進む必要はありません。

7

logging.configモジュールは、複数行の値をサポートするConfigParserの設定ファイルを読み取ります。

ですから、このようなあなたのformat文字列を指定することができます

[formatter_form01] 
format=F1 
    %(asctime)s %(levelname)s %(message)s 
datefmt= 
class=logging.Formatter 

をマルチライン値は、以下の行を(1つ以上のスペースまたはタブインデントとしてカウント)インデントによって継続されます。

5

ログ設定ファイルは、ConfigParserモジュールに基づいています。そこには、あなたがこのようにそれを解決することができます見つけることができます:

[formatter_form01] 
format=F1 
    %(asctime)s %(levelname)s %(message)s 
datefmt= 
class=logging.Formatter 
0

これは簡単な方法かもしれない:私がテストし

import logging 
logformat = """%(asctime)s ... here you get a new line 
    ... %(thread)d .... here you get another new line 
    %(message)s""" 
logging.basicConfig(format=logformat, level=logging.DEBUG) 

、上記の設定はそれとして、各ログメッセージには、2つの新しい行を与えますコードに示されています。注:%(asctime)sとこのようなものは、Pythonロギングフォーマット文字列です。

0
import logging 
logformat = "%(asctime)s %(message)s\n\r" 
logging.basicConfig(level=logging.DEBUG, format=logformat,filename='debug.log', filemode='w')   
logging.debug (Your String here) 

ファイル内のデバッグテキストは改行で書き込まれます。

関連する問題