私のアプリケーションにはログレベル TRACE (5) が必要ですが、それだけではdebug()
十分ではないと思います。さらに、これlog(5, msg)
は私が望んでいるものではありません。Python ロガーにカスタム ログレベルを追加するにはどうすればよいでしょうか?
mylogger.py
以下の内容の があります:
import logging
@property
def log(obj):
myLogger = logging.getLogger(obj.__class__.__name__)
return myLogger
私のコードでは、次のように使用します。
class ExampleClass(object):
from mylogger import log
def __init__(self):
'''The constructor with the logger'''
self.log.debug("Init runs")
今電話したいのですがself.log.trace("foo bar")
編集(2016年12月8日):承認された回答を次のように変更しました。PFAのこれは、私見では、Eric S. の非常に優れた提案に基づいた優れたソリューションです。
ベストアンサー1
2022年以降にこの記事を読んでいる人へ: 現在次に評価の高い回答をここでチェックしてみるといいでしょう:https://stackoverflow.com/a/35804945/1691778
私の元の回答は以下の通りです。
--
@エリック S.
Eric S.さんの回答は素晴らしいですが、実験してみると、ログレベルが何に設定されているかに関係なく、新しいデバッグレベルでログに記録されたメッセージが常に出力されることがわかりました。したがって、新しいレベル番号を にした場合9
、 を呼び出すとsetLevel(50)
、下層階メッセージが誤って印刷されます。
これを防ぐには、「debugv」関数内に別の行を追加して、問題のログ レベルが実際に有効になっているかどうかを確認する必要があります。
ログ レベルが有効になっているかどうかを確認する例を修正しました。
import logging
DEBUG_LEVELV_NUM = 9
logging.addLevelName(DEBUG_LEVELV_NUM, "DEBUGV")
def debugv(self, message, *args, **kws):
if self.isEnabledFor(DEBUG_LEVELV_NUM):
# Yes, logger takes its '*args' as 'args'.
self._log(DEBUG_LEVELV_NUM, message, args, **kws)
logging.Logger.debugv = debugv
class Logger
Python 2.7のコードを見てみるとlogging.__init__.py
、これがすべての標準ログ関数 (.critical、.debug など) が行うことです。
評判が悪いため、他の人の回答に返信を投稿できないようです... エリックがこれを見た場合は投稿を更新してくれるといいのですが。=)