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行目でファイル名を指定しているだけで、フォーマッタで出力属性を指定して生成したハンドラーに値を渡し、最終フォーマットしたハンドラーをロガーに渡しています。
イメージすることが大切
酒井さんの講座は、入門編を終了したあと、一気に自己学習の必要性が増します。
ボケっとレクチャーを受講しているだけでは全く理解できないかもしれません。
わからないところは、自分で調べて理解して、それでもわからないことは質問することができるので、まずは、どのように使うのか、自分で調べながらイメージしてみることが大切です。
また、Pythonのスキルを向上するためには、講座の中で学習していないことも貪欲に自分で調べて学習することも大切です。
ロガーだけでかなり学習することが多いので、理解するのが大変ですが、しっかりと理解しながらPython学習をすすめていこうと思います。
それでは明日も、Good Python!