Python その2 Advent Calendar 2018 10日目の記事です。
はじめに
Pythonでログ出力する際に何を使っていますか、print
でしょうか。それともlogging
でしょうか。ロギングは奥が深いようで、以下の記事ではlogging
の使い方を詳説されています。
標準ライブラリのlogging
でも良いのですが、今回はより簡単にログ出力が可能なlogzeroというライブラリを紹介したいと思います。
インストール
インストールは他のライブラリと同じくpip
でできます。
$ pip install logzero
使い方
基本
基本は、以下のように使うことができます。
from logzero import logger logger.debug('debug') logger.info('info') logger.warning('warning') logger.error('error')
色付きで出力されます。
ログレベルの設定
ログレベルを設定すると必要に応じて出力を制限することができます。
import logzero # INFO以上(INFO, WARNING, ERROR)を表示 logzero.loglevel(20) # ERRORのみ表示 logzero.loglevel(40)
指定する値はlogging
と同じです。なので、以下のようにも書くことができます。
import logging # INFO以上を表示 logzero.loglevel(logging.INFO) # ERRORのみ表示 logzero.loglevel(logging.ERROR)
デフォルトは10
(logging.DEBUG
)ですべて表示します。
またログレベルの名前と値の対応は以下の表のとおりです。
ログレベル | 値 |
---|---|
DEBUG | 10 |
INFO | 20 |
WARNING | 30 |
ERROR | 40 |
ファイルに出力
ログをファイルに出力するにはlogzero.logfile
を使います。
logzero.logfile('sample.log')
標準出力に加えて、ファイルにも出力することができるようになります。
標準出力はいらないという場合は、オプションで切ることもできます。
logzero.logfile('sample.log', disableStderrLogger=True)
ログファイルへの出力のログレベルは、logzero.loglevel
で指定したものが使われますが、異なるログレベルをしたいときはオプションで指定することができます。
# 標準出力はINFO以上 logzero.loglevel(20) # ファイルにはERRORのみ logzero.logfile('sample.log', loglevel=40)
ログローテーション
ログのローテーションも、logzero.logfile
のオプションで簡単に行うことができます。
# 最大1024B=1KBのログファイルを3世代まで logzero.logfile('sample.log', maxBytes=1024, backupCount=3)
maxBytes
でログファイルの最大容量を指定し、超えるとsample.log
がsample.log.1
にリネームされます。
sample.log.1
がすでにある場合は、sample.log.1
がsample.log.2
にリネームされ、sample.log
がsample.log.1
にリネームされます。
新たに書き込まれるのは、常にsample.log
となります。
backupCount
で何世代まで保存するか指定し、超えると破棄されます。backupCount=3
の場合、sample.log.3
まで作成されます。
注意点として、ログローテーションを行うためには、maxBytes
とbackupCount
の両方を指定する必要があります。
片方を指定しない場合や0
を指定した場合はローテーションは行われません。
フォーマット変更
標準では
[D 181208 16:06:22 main:5] debug [I 181208 16:06:22 main:6] info [W 181208 16:06:22 main:7] warning [E 181208 16:06:22 main:8] error
のようなログが出力されましたが、フォーマットを変更することもできます。
変更するには、logzero.formatter
を使い、logging.Formatter
で指定します。
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
logzero.formatter(formatter)
上の例だと、以下のような形式で出力されます。(色は消えました。。)
2018-12-08 16:29:10,652 DEBUG: debug 2018-12-08 16:29:10,652 INFO: info 2018-12-08 16:29:10,652 WARNING: warning 2018-12-08 16:29:10,652 ERROR: error
asctime
などのlogging.Formatter
の形式は以下のドキュメントを参照すると良いです。
16.6. logging — Python 用ロギング機能 — Python 3.6.5 ドキュメント
まとめて設定
logzero.setup_logger
を使うとこれまで紹介してきた設定をまとめて行うことができます。むしろこれだけでいいような気がします。
logger = logzero.setup_logger( name='logzero-sample', # loggerの名前、複数loggerを用意するときに区別できる logfile='sample.log', # ログファイルの格納先 level=20, # 標準出力のログレベル formatter=None, # ログのフォーマット maxBytes=1000, # ログローテーションする際のファイルの最大バイト数 backupCount=3, # ログローテーションする際のバックアップ数 fileLoglevel=40, # ログファイルのログレベル disableStderrLogger=False # 標準出力するかどうか )
おわりに
ログ出力を手軽に行うことができるライブラリlogzeroを紹介しました。
これまで、ちょっとしたスクリプトだとprint
で出力していたものも、これを使えば簡単に書けそうなので、積極的に使っていこうかなと思います。