1. ホーム
  2. python

[解決済み] Pythonのロギング機能にカスタムログレベルを追加する方法

2022-05-04 06:23:15

質問

私のアプリケーションのログレベル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. からの非常に優れた提案に基づく、優れた解決策であると IMHO は考えています。

解決方法は?

2022年以降に読む人へ:現在、次に評価の高い答えはこちらで確認した方がいいと思います。 https://stackoverflow.com/a/35804945/1691778

私の当初の回答は以下の通りです。

--

@Eric 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 Loggerlogging.__init__.py Python 2.7 の場合、これはすべての標準的なログ関数 (.critical, .debug, etc) が行うことです。

どうやら私は評判が良くないため、他の方の回答への返信を投稿できないようです...Ericがこれを見たら、彼の投稿を更新してくれることを願っています =)。