2016/12/21

[py]コンソールログを出力させたい

多少pythonにも慣れてきて、ことあるごとに出力させていたprintが邪魔になってきた。
が、全部消してしまうと困るかもしれないし、大幅に変更させるときにはまた復活させたくなるかもしれない。

そうなると、デバッグレベルに応じて出力させたりさせなかったりを制御したい。


「python ログ」で検索すると、こちらが出てきた(私はまだpython2.7を使っているのだ)。

Logging HOWTO — Python 2.7.x ドキュメント

「ロギングレベルをコマンドラインオプションから~」とあるので、pythonにそういうオプションがあるのかと思ったが、単に引数を解析してからやるだけのようだった。
もしかしたら、getoptみたいな関数があるのかもしれんが、調べる気力が無いので、第1引数をそのままロギングレベルと見なすように書いてみた。

import logging
import sys

loglevel = sys.argv[1]
# print 'getattr=', getattr(logging, loglevel.upper(), None)
numeric_level = getattr(logging, loglevel.upper(), None)
if not isinstance(numeric_level, int):
    raise ValueError('Invalid log level: %s' % loglevel)
logging.basicConfig(level=numeric_level)

logging.debug('debug')
logging.info('info')
logging.warning('warning')

INFO、とするとinfoが出るし、DEBUGとすればdebugも出てきた。
コンソール出力を「> log.txt」にしても空っぽで、「2>&1」を追加すると入ったところからすると、標準エラー出力がデフォルトのようである。
まあ、ファイルに保存する設定もあるから、そこまでリダイレクトしたいことはないのかもしれんがね。


これくらいは用は足りそうなのだが、loggingページのまだ最初の方だ。
もっと便利な何かがあるのだろうか?

変数の表示が%で指定するタイプだ、とか、時刻を入れるフォーマットにできるよ、とか、そういうのがちょっと書いてあって、あとは上級編になるようだ。

ちょっとだけ眺めてみたが、loggingは、logger, handler, filter, formatter、の4つから構成されているようだ。
こんなに複雑だったのか・・・。
自分でいろいろ指示することによって、カスタマイズできるようになっているようで、クックブックのページも用意されていた。

Logging クックブック — Python 2.7.x ドキュメント

 

まあ、そこまで踏み込まなくていいな。

  • 地の文:print
  • 普段はいらない、細かいデバッグ出力:logging.debug()
  • 問題ないかもしれないけど念のため忠告の出力:logging.info()
  • ちょっとないかもねー、バグってんじゃないの?の出力:logging.warning()
  • これはダメだー、の出力:logging.error()

私の場合は、debugとerrorがあればまだ足りるかな。
errorも、その後はquit()で終わらせるしかないなら、もうprintでもよい気がする。
ログ出力できるほど優雅じゃ無い環境が多いので、自由に出してよいといわれると困るのよねぇ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。