Python3.4のLoggingモジュールでログメッセージの文字列フォーマットをstr.formatメソッドの書式指定文字列を使う方法

タイトル長くてすみません。タイトル通りで使い方をただメモしたかっただけです。

# これはダメ
>>> logging.basicConfig(format="[str.format ver] :{} / {}".format(levelname, message))

NameError Traceback (most recent call last)
<ipython-input-15-6b4e7d3e1ac2> in <module>()
----> 1 loghandle=logging.basicConfig(format="str.format log :{} / {}".format(levelname, message))
NameError: name 'levelname' is not defined
# まあそうだよね・・・

# これで出来ました
>>> logging.basicConfig(format="[str.format ver] :{levelname} - {message}", style="{")
>>> logging.warn("warning!!")
[str.format ver] :WARNING - warning!!

basicConfigというかFormatterメソッドなんですが、styleパラメータに"{"を設定すれば使えるようです。

このstyle属性は3.2から追加されたものらしいので、最近のpyhton3でないとダメとのこと。

16.7. logging — Python 用ロギング機能 — Python 3.4.1 ドキュメント -logging.Formatter

Logging クックブック — Python 3.4.1 ドキュメント - Using particular formatting styles throughout your application

最近formatメソッドの書式に慣れてしまってたのでいちいち%演算子に戻るのが面倒だったのでこうなりました。

ちなみにdatefmtで日付のカスタムも出来ますが、str.formatメソッドで出来ませんでした。

>>> logging.basicConfig(format="{asctime} [str.format ver] :{levelname} - {message}", datefmt="{Y}-{m}-{d} {H}:{M}:{S}", style="{")

>>> logging.warn("warning!!")
{Y}-{m}-{d} {H}:{M}:{S} [str.format ver] :WARNING - warning!!

あとこれを調べていて知ったのですが、string.templateというテンプレート方式もあるらしいです。2.4の頃からあるらしいのですが、これ知らなかった。。。

6.1. string — 一般的な文字列操作 — Python 3.3.5 ドキュメント - テンプレート文字列

About Me

買ったり作ったり考えたり試したの日々の記録です