ここでpython 2 についてこの質問をしましたが、答えが Python 3.2.3 で機能しなくなったときに、再び問題にぶつかりました。
Python 2.7.3 で動作するコードは次のとおりです。
import logging
# Attempt to set up a Python3 logger than will print custom messages
# based on each message's logging level.
# The technique recommended for Python2 does not appear to work for
# Python3
class CustomConsoleFormatter(logging.Formatter):
"""
Modify the way DEBUG messages are displayed.
"""
def __init__(self, fmt="%(levelno)d: %(msg)s"):
logging.Formatter.__init__(self, fmt=fmt)
def format(self, record):
# Remember the original format
format_orig = self._fmt
if record.levelno == logging.DEBUG:
self._fmt = "DEBUG: %(msg)s"
# Call the original formatter to do the grunt work
result = logging.Formatter.format(self, record)
# Restore the original format
self._fmt = format_orig
return result
# Set up a logger
my_logger = logging.getLogger("my_custom_logger")
my_logger.setLevel(logging.DEBUG)
my_formatter = CustomConsoleFormatter()
console_handler = logging.StreamHandler()
console_handler.setFormatter(my_formatter)
my_logger.addHandler(console_handler)
my_logger.debug("This is a DEBUG-level message")
my_logger.info("This is an INFO-level message")
Python 2.7.3 を使用した実行:
tcsh-16: python demo_python_2.7.3.py
DEBUG: This is a DEBUG-level message
20: This is an INFO-level message
私の知る限り、Python3 への変換には、CustomConsoleFormatter へのわずかな変更のみが必要です。初期化():
def __init__(self):
super().__init__(fmt="%(levelno)d: %(msg)s", datefmt=None, style='%')
Python 3.2.3 の場合:
tcsh-26: python3 demo_python_3.2.3.py
10: This is a DEBUG-level message
20: This is an INFO-level message
ご覧のとおり、'10' を 'DEBUG' に置き換えたいという私の願望が妨げられています。
私はPython3ソースを掘り下げてみましたが、PercentStyleのインスタンス化がself._fmtを壊しているように見えます。
私のロギングチョップは、このしわを回避できるようになる直前に停止します。
誰かが別の方法を推奨したり、私が見落としていることを指摘したりできますか?