8

Pythonsloggingモジュールを使用しています。「msg packagename.modulename.functionName lineNumber」のように、メッセージのフル パスをログに記録したいのですが、メッセージ
のパッケージ名を取得するにはどうすればよいですか?

ロギング構成は次のとおりです。

LOGGING = {    
'formatters': {
    'simple': {
    'format': '[%(levelname)s] %(message)s [%(module)s %(funcName)s %(lineno)d]'
    },  
},
'handlers': {
'console': {
        'level':'INFO',
        'class':'logging.StreamHandler',
        'formatter':'simple',
    }
},
'loggers': {
    'develop': {
        'handlers': ['console'],
        'level': 'DEBUG',
        'propagate': True,
    },
}

}

そして、私は次のようなロガーを取得します:

logger = logging.getLogger('develop')
4

6 に答える 6

5

Javaがデフォルトで行うように「パッケージ名」を取得する方法はわかりませんが、ファイル名を追加するには(これにより、同じようにコンテキストが得られます)、%(pathname)sフォーマット文字列で使用します:

'format': '[%(levelname)s] %(message)s [%(pathname)s %(funcName)s %(lineno)d]'

ここのドキュメントを参照してください: https://docs.python.org/2/library/logging.html#logrecord-attributes

于 2016-12-22T01:03:04.273 に答える
2

common というパッケージ内に utils.py ファイルがあり、以下があります。

ユーティリティ.py

import logging
log = logging
log.basicConfig(level=log.INFO, format='%(asctime)s:%(filename)s:%(funcName)s'
                                       ':%(levelname)s :%(message)s')

ログを使用する必要がある他のファイルでは、以下を使用します。

from pkg.common.utils import log
log.info("some msg")
于 2020-05-25T01:44:10.067 に答える
2

この問題には 2 つの解決策があります。

1 つ目は、log.[debug,info,error,...] へのすべての呼び出しで、__file__マジック変数によって取得されたファイル名を渡します。これではパッケージ名はわかりませんが、ログ メッセージの発信元を見つけるのと同じくらい役に立ちます。欠点は、アプリケーション内のすべてのロギング呼び出しを変更する必要があることです。

2 つ目は、インスタンス メソッドlogging.Loggerをオーバーライドするサブクラスを作成することです。Logger.log新しいlogメソッドで、メソッドinspect.stack()inspect.getframeinfo()メソッドを使用して、コード内で呼び出しの原因となったスタック フレームを見つけ、logファイル名と行番号を抽出します。その後、渡されたログ メッセージを適宜変更できます。最後に、loggingを呼び出して、サブクラスを使用するようにモジュールに指示しますlogging.setLoggerClass()

于 2012-04-18T09:29:05.697 に答える
1

これを実装した例を次に示します: https ://github.com/JensTimmerman/vsc-base/blob/master/lib/vsc/utils/fancylogger.py

Simonが示唆しているように、カスタムフィールドを追加するためにPythonロガーに拡張しました。ただし、これを行う新しいgetLogger関数を定義することもできます。

rootmodulename = inspect.stack()[-1][1].split('/')[-1].split('.')[0]
callingfunctionname = inspect.stack()[2][3]
logger = logging.getLogger("%s.%s" % (rootmodulename, callingfunctionname))

しかし、完全にうまくいった例については、fancylogger.pyを調べてください。

于 2012-08-31T14:30:20.833 に答える