2017-10-26 5 views
1

私は、次の形式の文字列でのpythonのログを使用しています:Pythonロギングフォーマット:ロガー名の最後の部分だけを印刷するには?

'format': '%(asctime)s %(levelname)s %(name)s - %(message)s' 

%(name)s一部を印刷ロガー名:他のロギングファシリティ(のようなのlog4j)私はしたいと同様

 
2017-10-26 13:17:58,019 INFO device_gps.comm.protocol - GPSProtocol(port=COM13) - Starting GPS serial communications (port: COM13) 
2017-10-26 13:17:58,022 INFO scs_control.context - Starting component: DeviceGPS 
2017-10-26 13:17:58,033 INFO scs_elevation.elevation - Initializing ElevationModel engine instance. 

簡潔にするためにロガー名の最後の部分だけを印刷するようにします(上の例では太字で示しています)。

このother answerは、ロガー名を変更することを提案していますが、そうすることで親子ロガー関係が破壊されるため、ロガーのグループのロギングを構成することは本当に便利です。

ロガー名の最後の部分を印刷するにはどうすればよいですか?ロギングで使用可能な

答えて

1

フィルタを設定して、LogRecord属性をロガー名の最後の部分に設定し、その文字列をフォーマット文字列で使用することができます。たとえば、このスクリプトを実行すると:

import logging 

class LastPartFilter(logging.Filter): 
    def filter(self, record): 
     record.name_last = record.name.rsplit('.', 1)[-1] 
     return True 

logger = logging.getLogger() 
handler = logging.StreamHandler() 
formatter = logging.Formatter('%(name_last)s %(message)s') 
handler.setFormatter(formatter) 
logger.addHandler(handler) 
handler.addFilter(LastPartFilter()) 

logging.getLogger('foo').warning('Watch out - foo!') 
logging.getLogger('foo.bar').warning('Watch out - foo.bar!') 
logging.getLogger('foo.bar.baz').warning('Watch out - foo.bar.baz!') 

は、この生成します

fooが気をつけて - FOOを!
barウォッチアウト - foo.bar!
baz注意 - foo.bar.baz!

+0

素晴らしいです。フィルターがフィールドを追加できるかどうか分かりませんでした(むしろ、フォーマット文字列は文字列補間のデータオブジェクトとしてログレコードを使用します)。ありがとう、あなたロック! – jjmontes

+1

@jjmontesフィルタを使用してフィールドを追加する方法については、https://docs.python.org/3/howto/logging-cookbook.html#using-filters-to-impart-contextual-information –

0

属性は、あなたはおそらく、あなたのフォーマットが'%(asctime)s %(levelname)s %(module)s - %(message)s'になりたい

hereを記載されています。

+0

答えをありがとう。残念ながら、私のロガーの中には、それほど意味のないモジュール名を持つ第三者図書館に所属するものもあります。ロガー名は設定できますが、モジュール名は設定できませんので、モジュールの代わりに名前の最後の部分を使用します。 – jjmontes

関連する問題