Python ロギングハンドラー Udemy講座

Python学習【365日チャレンジ!】126日目のマスターU(@Udemy11)です。

少し前からキングダムにハマっていたのですが、Amazonプライムで見られるシリーズをコンプリートしてしまいました。

シーズン1が38話、シーズン2が39話、シーズン3が4話なので、もういい加減睡眠不足で頭痛がしてきました。

一度見始めたら、次が気になってくるので、なかなか途中でやめられないんですよね。

シーズン3は、現在放映中で、コロナの関係で第4話で止まっていたので、ようやく追いついたって感じで、次は漫画を追いかけてしまいそうです。

とりあえず一息ついたので、たっぷり睡眠を取ろうと思っています。

それでは、今日もPython学習を始めちゃいましょう!

昨日の復習

昨日は、ロギングのロガーの使い方について学習しました。

ロギングをする際は、loggingモジュールから直接ログを出力するのではなく、getLogger()を使ってロガーを生成し、ログを出力しました。

オブジェクトごとにカスタマイズできるので、ロギングの際は必ずロガーを使ってログを取るのが基本でした。

それでは、今日の学習、ハンドラーにはいりましょう。

ハンドラーとは

とりあえず、ハンドラーをネットで調べてみると、次のような答えが返ってきました。

ハンドラーとは

ユーザーやOSなどからの要求に対応するためのプログラムモジュール。処理を終了させる要求などを受け取り、それに応じた処理を行う。また、アプリケーションにおいて処理要求に応じて呼び出されるモジュールを指すこともある。たとえば、割り込みを処理する割り込みハンドラーというものがある。

Pythonのロギングハンドラーは、ログをコンソールに出力する処理をしたり、ファイルにログを出力したりする役割を持っています。

Pythonのロギングハンドラーには、コンソールに出力するStreamHandlerやファイルに出力するFileHandler、ログのメール送信ができるSMTPHandlerなど様々な種類のハンドラーが用意されています。

StreamHandler

StreamHandlerは、コンソールに出力するハンドラーです。

個人的には、現段階では通常のロガー出力でコンソールに出力できるので、必要あるのかなと疑問に思ってしまいます。

疑問に思いつつもStreamHandlerを使う理由を考えてみると、loggingで直接出力せずにロガーを使うのと一緒で、通常のコンソール出力はStreamHandlerを使うことで、他のハンドラーとの違いを整理でき、きれいなコードにするためだということにたどりつきました。

それでは、実際にコードを書いてみましょう。

import logging


logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

h = logging.StreamHandler()

fmt = logging.Formatter(
    '%(asctime)s:'
    '%(name)s:'
    '%(levelname)s:'
    '%(message)s'
)

h.setFormatter(fmt)

logger.addHandler(h)

logger.info('main file info')

出力結果

2020-06-15 19:47:47,154:__main__:INFO:main file info

まず、7行目でStreamHandlerオブジェクトを生成しています。

9行目から14行目でFormatterを使ってLogRecord属性を指定し、16行目のsetFormatterで生成したハンドラーhに値を渡しています。

次に18行目のaddHandlerでフォーマットされたハンドラーhをロガーに渡しています。

ちなみに、9行目から16行目までがなくてもログは出力可能ですが、その場合、20行目で指定しているmain file infoだけが出力されます。

FileHandler

次に、FileHandlerを使ってファイルにログを出力します。

import logging


logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

h = logging.FileHandler('logtest.log')

fmt = logging.Formatter(
    '%(asctime)s:'
    '%(name)s:'
    '%(levelname)s:'
    '%(message)s'
)

h.setFormatter(fmt)

logger.addHandler(h)

logger.info('main file info')

実行結果は、このファイルと同じ階層にlogtest.logというファイルが作られ、その中身は先程のStreamHandlerの出力結果2020-06-15 19:50:42,121:__main__:INFO:main file infoと同じになります。

StreamHandlerとの違いは、7行目でファイル名を指定しているだけで、フォーマッタで出力属性を指定して生成したハンドラーに値を渡し、最終フォーマットしたハンドラーをロガーに渡しています。

イメージすることが大切

酒井さんの講座は、入門編を終了したあと、一気に自己学習の必要性が増します。

Udemy講師 酒井さん プログラミング Python

ボケっとレクチャーを受講しているだけでは全く理解できないかもしれません。

わからないところは、自分で調べて理解して、それでもわからないことは質問することができるので、まずは、どのように使うのか、自分で調べながらイメージしてみることが大切です。

また、Pythonのスキルを向上するためには、講座の中で学習していないことも貪欲に自分で調べて学習することも大切です。

ロガーだけでかなり学習することが多いので、理解するのが大変ですが、しっかりと理解しながらPython学習をすすめていこうと思います。

それでは明日も、Good Python!