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')
こんな感じに表示されます。INFOレベルはそのまま表示です。
WARNING以上は、詳細を表示させています。
※WARNがなんで明るい緑?私のターミナル色弱だったのか?
ロガーいろいろ
ストリーム
- 通常は、INFOレベル以上の出力。
is_debug_stream = True
の場合は、DEGUGレベル以上の出力にしています。 - 通常状態では、WARNING以上に詳細を表示させるようにしました。
- 出力は色を付けて見やすくするために、手軽にパッケージcolorlogを利用しました。(今後は自分で実装、さらに見やすいようにカラー部分増やしたいと考え中)
-
Delogger.is_stream = False
とすることでストリームへの出力を無くす。 - ↓
is_debug_stream = True
時の出力例
ログファイル
- 基本的に実行単位でログを保存したかったのでハンドラー作りました。
- デフォルトのログファイルが、
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')
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送信とか)
- 対応として内部では
QueueHandler
やQueueListener
を利用。 - <注意>下記キュー対応ロギングを利用する場合は、全ロガー同じハンドラー内容になってしまいます。(全てのロガーに対して出力順番とか正常になるように考えて、いろいろ試した結果です)
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')
ロギング処理は、別スレッドで実行されているようです。
pytest
・テストには、pytestつかいました。
・pytestのpの縦棒ぐらいの理解度ですが。。。
・軽くテスト書いてみました。完全網羅はしていませんが、最低限書いたつもりです。
さいごに
今後も利用してみて、不満点とか出てきたら改良していきます。
ログ形式とか割と適当になっちゃったので、見やすいログ形式に変更していきたいと思ってます。(見やすいログ形式ってどんなだろう?)
主に自分で利用するために作成したパッケージですが、使ってみたいと思った方がいたら、ぜひ使ってみてください!