7
6

More than 5 years have passed since last update.

Pythonロギングを(主に自分が)快適になるDeloggerプラグイン

Last updated at Posted at 2018-12-10

Pythonでログ出力する際に何を使っていますか、printでしょうか。それともloggingでしょうか。(デジャブ)

前日のアドベントカレンダーPythonのログ出力にlogzeroを使う
と続けてまさかの2日連続のロギング会です!

自作パッケージDeloggerとは、主に自分がロギング処理を楽にするために作成しました。
なんと、Python3.4以上のバージョンしか対応してません!
3.5以上にしたかった(Type Hints使ってみたかった)ですが、なんとなくの理由で3.4以上(最低限pathlib使いたかった)にしました。

Delogger

  • 安直に、Debug loggerという意味!
  • 手軽に(自分が)よく使うロギングを設定してくれるパッケージ!
  • カラーでストリーム!ログファイル生成!時にはSlack通知!
  • 様々な設定値ですが、クラス変数だと全ロガー共通設定に。インスタンス変数だとそのロガー限定の設定となります!

利用例

from delogger import Delogger

delogger = Delogger(name='test_logger') # nameなくても問題ないです。
logger = delogger.logger

logger.info('Start logging')
logger.debug('debug')
logger.warning('warning')
logger.info('End logging')

48709824-fad79400-ec49-11e8-8a93-a5c72bdec5fc.png

こんな感じに表示されます。INFOレベルはそのまま表示です。
WARNING以上は、詳細を表示させています。
※WARNがなんで明るい緑?私のターミナル色弱だったのか?

ロガーいろいろ

ストリーム

  • 通常は、INFOレベル以上の出力。is_debug_stream = Trueの場合は、DEGUGレベル以上の出力にしています。
  • 通常状態では、WARNING以上に詳細を表示させるようにしました。
  • 出力は色を付けて見やすくするために、手軽にパッケージcolorlogを利用しました。(今後は自分で実装、さらに見やすいようにカラー部分増やしたいと考え中)
  • Delogger.is_stream = Falseとすることでストリームへの出力を無くす。
  • is_debug_stream = True時の出力例 debug-demo

ログファイル

  • 基本的に実行単位でログを保存したかったのでハンドラー作りました。
  • デフォルトのログファイルが、2018-12-09 07:00:00.logのようなファイル名なので、  ほぼ実行単位での保存になります。
  • Delogger.filepath = '%Y/%m-%d.log'のように設定すればできます。年別にディレクトリ作り、日毎にログ残せます!利用できる書式文字
from delogger import Delogger

Delogger.is_save_file = True
delogger = Delogger(name='test_logger', filepath='%Y/%m%d.log')
logger = delogger.logger

logger.info('Start logging')
logger.debug('debug')
logger.warning('warning')
logger.info('End logging')

logfile-demo

Slack通知

  • Slackにて通知させたいときがあります。以下サンプルです。
from delogger import Delogger, SlackHandler

delogger = Delogger(name='test_logger')
slack_hdlr = SlackHandler(token='SLACK_TOKEN', channel='#test_channel')
delogger.add_handler(slack_hdlr, Delogger.INFO, only_level=True)
logger = delogger.logger

logger.info('Start logging')
logger.debug('debug')
logger.warning('warning')
logger.info('End logging')

only_level = Trueにすることによって、INFOレベルのみをSlack通知するようにしてます。
今後、INFOレベルだがSlack飛ばしたくないとか、このメッセージは飛ばしたいとか実装したいと思ってます。

キュー

  • ロギング処理をいれると些細なものですが、その分処理時間がとられます。(特にネットワーク処理が伴うものは時間かかります。メール送信とかSlack送信とか)
  • 対応として内部ではQueueHandlerQueueListenerを利用。
  • <注意>下記キュー対応ロギングを利用する場合は、全ロガー同じハンドラー内容になってしまいます。(全てのロガーに対して出力順番とか正常になるように考えて、いろいろ試した結果です)
import time

from delogger import DeloggerQueue

delogger = DeloggerQueue(name='test_logger')
logger = delogger.logger

print('Start queue mode')
logger.info('Start logging')
logger.debug('debug')
logger.warning('warning')
time.sleep(1)
logger.info('End logging')
print('End queue mode')

48709874-1e024380-ec4a-11e8-818f-521260c9c4e9.png

ロギング処理は、別スレッドで実行されているようです。

pytest

・テストには、pytestつかいました。
・pytestのpの縦棒ぐらいの理解度ですが。。。
・軽くテスト書いてみました。完全網羅はしていませんが、最低限書いたつもりです。

さいごに

今後も利用してみて、不満点とか出てきたら改良していきます。
ログ形式とか割と適当になっちゃったので、見やすいログ形式に変更していきたいと思ってます。(見やすいログ形式ってどんなだろう?)
主に自分で利用するために作成したパッケージですが、使ってみたいと思った方がいたら、ぜひ使ってみてください!

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6