スタイルや内部フィールドに依存する代わりに、record.levelno (またはその他の基準) に応じて他のフォーマッターに委任するフォーマッターを作成することもできます。私の謙虚な意見では、これは少しクリーンなソリューションです。以下のコードは、2.7 以上のすべての Python バージョンで動作するはずです。
簡単な方法は次のようになります。
class MyFormatter(logging.Formatter):
default_fmt = logging.Formatter('%(levelname)s in %(name)s: %(message)s')
info_fmt = logging.Formatter('%(message)s')
def format(self, record):
if record.levelno == logging.INFO:
return self.info_fmt.format(record)
else:
return self.default_fmt.format(record)
ただし、より一般的なものにすることもできます。
class VarFormatter(logging.Formatter):
default_formatter = logging.Formatter('%(levelname)s in %(name)s: %(message)s')
def __init__(self, formats):
""" formats is a dict { loglevel : logformat } """
self.formatters = {}
for loglevel in formats:
self.formatters[loglevel] = logging.Formatter(formats[loglevel])
def format(self, record):
formatter = self.formatters.get(record.levelno, self.default_formatter)
return formatter.format(record)
ここでは入力として dict を使用しましたが、明らかにタプル、**kwargs など、ボートに浮かぶものは何でも使用できます。これは次のように使用されます。
formatter = VarFormatter({logging.INFO: '[%(message)s]',
logging.WARNING: 'warning: %(message)s'})
<... attach formatter to logger ...>