web-dev-qa-db-ja.com

ソースファイル名と行番号をPython

python標準のロギングシステムを修飾/拡張することは可能ですか?ロギングメソッドが呼び出されると、ファイルと、それが呼び出された行番号またはそれを呼び出したメソッドも記録します?

94
digy

確かに、ロギングドキュメントの formatters を確認してください。具体的には、lineno変数とpathname変数。

%(pathname)sロギングコールが発行されたソースファイルのフルパス名(利用可能な場合)。

%(filename)sパス名のファイル名部分。

%(module)sモジュール(ファイル名の名前部分)。

%(funcName)sロギング呼び出しを含む関数の名前。

%(lineno)dロギングコールが発行されたソース行番号(利用可能な場合)。

次のようになります。

formatter = logging.Formatter('[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s','%m-%d %H:%M:%S')
179
Seb

Sebの非常に有用な答え の上に、ロガーの使用法を適切な形式で示す便利なコードスニペットを示します。

#!/usr/bin/env python
import logging

logging.basicConfig(format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
    datefmt='%Y-%m-%d:%H:%M:%S',
    level=logging.DEBUG)

logger = logging.getLogger(__name__)
logger.debug("This is a debug log")
logger.info("This is an info log")
logger.critical("This is critical")
logger.error("An error occurred")

次の出力を生成します。

2017-06-06:17:07:02,158 DEBUG    [log.py:11] This is a debug log
2017-06-06:17:07:02,158 INFO     [log.py:12] This is an info log
2017-06-06:17:07:02,158 CRITICAL [log.py:13] This is critical
2017-06-06:17:07:02,158 ERROR    [log.py:14] An error occurred
56
codeforester

デバッグロギングを標準出力に送信する方法で上記を構築するには:

_import logging
import sys

root = logging.getLogger()
root.setLevel(logging.DEBUG)

ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
FORMAT = "[%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s"
formatter = logging.Formatter(FORMAT)
ch.setFormatter(formatter)
root.addHandler(ch)

logging.debug("I am sent to standard out.")
_

上記を_debug_logging_example.py_というファイルに入れると、出力が生成されます。

_[debug_logging_example.py:14 -             <module>() ] I am sent to standard out.
_

次に、コメントアウトのログをオフにする場合は、root.setLevel(logging.DEBUG)を使用します。

単一ファイル(クラスの割り当てなど)の場合、print()ステートメントを使用するよりもはるかに優れた方法であることがわかりました。送信する前に、デバッグ出力を1か所でオフにすることができます。

1
orangepips