【Python入門】loggingモジュールでログを表示してみよう!

image
長野 透
書いた人 長野 透

こんにちは!フリーランスの長野です。

ログとは、プログラムの実行中に起こった出来事の記録のことです。

またそのことをロギングといいます。

ソフトウェアを使っていてエラーや意図しない挙動があったとき、このログを確認することで不具合の種類を絞り込むことが出来ます。

この記事では、ロギングについて

・ロギングとは何か
・loggingモジュールの基本的な使い方

という基本的な内容から、

・ログの設定ファイルの書き方

など応用的な内容ついても解説していきます。

ロギングとは

ロギングとは、プログラムに起こった出来事についての情報を、時間経過に沿ってファイルに記録することです。

Pythonでは標準のloggingモジュールを使うことで、あらかじめ用意されたログの出力形式を使うことが出来ます。

この出力形式を使えば、print関数を使ったデバッグに比べて手軽に、より詳しい情報を表示することができます。

ログには、使っている設定値や詳細な情報表示などのデバッグ用の表示、正常動作の記録、警告を出しておきたい動作の記録、エラーなどの問題の記録、停止してしまうような致命的なエラーなどがあります。

これらの内容は、実行時に悪影響を及ぼす度合いによってレベル分けがされていて、どのレベルからログとして残すかを選択出来ます。

ログのレベル分けはこのように設定されています。

名前設定値役割
NOTSET0設定値などの記録(全ての記録)
DEBUG10動作確認などデバッグの記録
INFO20正常動作の記録
WARNING30ログの定義名
ERROR40エラーなど重大な問題
CRITICAL50停止など致命的な問題

このレベル分けに応じて、それぞれの箇所にログ出力の設定を書いていきます。

loggingモジュールの使い方

それでは、ロギング機能の使い方をサンプルコードとともに見ていきましょう。

基本的な使い方

ロギング機能を使うためには、loggingモジュールをインポートする必要があります。

それではログを出力する方法を、サンプルコードで見てみましょう。

実行結果

サンプルコードでは、log関数を使ってログを出力させています。

log関数の第1引数には、先程のログレベルの数値を渡します。

第2引数には、メッセージとして出力する文字列を入力します。

実行結果を確認すると、ログレベル20の出力が表示されていませんね。

これはデフォルトの設定でログレベル20(INFOレベル)以下は出力しない設定になっているからです。

またそれぞれのログレベルに対応したdebug、info、waring、error、criticalメソッドを使用して出力することもできます。

引数にはメッセージとして出力したい文字列を入力します。

この場合もデフォルト設定によりログレベルINFO以下は出力しない設定になっています。

ログをファイルに出力する

先ほどのサンプルコードでは、ロギング機能の基本的な使い方について解説しました。

しかし、先ほどのサンプルコードだけではログファイルの出力先などを決めることは出来ません。

そこで、ロギングの設定を行う方法について解説します。

それではサンプルコードを確認していきましょう。

実行結果

このサンプルコードでは、getLoggerメソッドを使って(1)のようにloggerオブジェクトを作成しています。

getLoggerメソッドの引数には文字列を渡し、ログの出力名を設定することができます。

loggerオブジェクトのsetLevelメソッドを使って、(2)のように出力するログレベルを10(DEBUGレベル)以上に設定しています。

この設定をすることで、INFOレベルのログも出力されるようになります。

次に(3)のように、ログファイルの出力先を設定します。

またこのままではコンソールにログ内容の出力が表示されないので、(4)のようにStreamHandlerクラスを使ってコンソールに出力表示されるように設定しています。

ログの出力形式を設定する

これまでのサンプルコードでは、ログの出力形式の設定はしていません。

ログとして、実行時刻やログの出力した場所、ログレベル名、メッセージなどがそろって出力されなければ、見やすいログとは言えません。

そこでログの出力形式を設定してみましょう。

ログの出力形式を設定するためには、loggingモジュールのFormatterクラスを用います。

それではサンプルコードを確認しながら使い方をみていきましょう。

実行結果

このサンプルコードではFormatterクラスを使って、ログの出力形式の設定をしています。

Formatterクラスの引数に出力形式を渡して、formatterのインスタンスを作成しています。

この例では、

実行時間(年-月-日 時-分-秒,ミリ秒):行番号:ログレベル名:メッセージ文字列

の形式で出力されるような設定になっています。

形式のフォーマットはこのようになっています。

フォーマット役割
%(asctime)s実行時刻
%(filename)sファイル名
%(funcName)s行番号
%(levelname)sログの定義
%(lineno)dログレベル名
%(message)sログメッセージ
%(module)sモジュール名
%(name)s関数名
%(process)dプロセスID
%(thread)dスレッドID

ログ設定ファイルの使い方

ログの設定は文字数(コードの量)が増えがちです。

そして文字数が増えると、コードが読みにくくなる原因にもなります。

そこでlogging.configモジュールを使って、ログの設定を「.conf」ファイルのような設定ファイルにまとめて書くことで管理がしやすくなります。

またこの章では少し高度な内容を含んでいるので、ステップアップしたい方はぜひご覧ください!

logging.confの使い方

ここからは実際にlogging.confという設定ファイルを作って、その仕組みを見ていきましょう。

まずはこちらのサンプルコードをご覧ください。

logging.conf

サンプルコード

実行結果

まずはlogging.confファイルの記述から見ていきましょう。

設定ファイルにはこの項目が必要になります。

・[loggers] 「keys=」の後に任意のlogger名を記述。「root」は必須。
・[handlers] 「keys=」の後に任意のhandler名を記述。
・[formatters] 「keys=」の後に任意のformatter名を記述。

複数設定する場合は「,」(カンマ)で区切りましょう。

次にこれまで記述したそれぞれの名称に対して設定を記述していきます。

[logger_logger名] ロガーにハンドラーの追加

handlersの設定を行います。

この例では[logger_root]として「handlers=」句の後にhandlerの名前を書いています。

[handler_handler名] ハンドラーの設定

class、level、formatter、argsなどの設定をします。

この例の[handler_consoleHandler]ではコンソールへのログ出力について設定しています。

argsにはコンソール出力の場合は出力先に「sys.stdout」を入力します。

argsには引数を複数設定する必要があり、引数が1つの場合であっても「,」で区切る必要があります。

この例の[handler_fileHandler]ではファイルへのログ表示について設定しています。

クラスにはファイルへ出力するためのlogging.FileHandlerクラスのクラス名を入力しています。

argsにはファイル出力の場合は出力先のアドレス名「test.log」を入力しています。

[formatter_formatter名] フォーマッターの設定

class、format、datefmtなどの設定を行います。

この例では[formatter_logFormatter]として「format=」句の後に出力形式のフォーマットを入力しています。

ログ設定ファイルの読み込みにはlogging.configモジュールのfileConfigメソッドを使用します。

fileConfigメソッドの引数にログ設定ファイルのアドレスを入力しています。

logging.getLoggerメソッドを使用してloggerオブジェクトを生成し、あとはこれまでのサンプルコードと同様にログ出力のメソッドを記述しています。

まとめ

ここでは、ロギング機能とその使い方について説明しました。

ロギング機能を使うことで、いつどんな処理が実行されどのような結果になったかを、さかのぼって確認することができます。

トラブルが発生した時にどんなエラーがどの箇所で発生したか把握できるので後々の対応がしやすくなり便利です。

この便利な仕組みを使いこなすことができるように、この記事を何度も参考にして下さいね!

Pythonカリキュラム無料公開中!
この記事はPython入門完全攻略ガイド【基礎学習/アプリ開発/仕事獲得】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習からアプリ開発、さらには仕事獲得まで体系的に学べる内容となっています。

Python学習に必要な情報を一つにまとめていますので効率よくPythonを学ぶことが出来ます。この機会に是非活用していただければと思います。



33歳、未経験だった僕がフリーエンジニアになれた理由
現在フリーでWEBエンジニアをやられている濱口直行さん。33歳で、プログラミングを学び始め、約半年という短い期間で独立までされた学習ログを余すことなくインタビューさせていただきました。

プログラミングを学習中の方はもちろん、独立をお考えの方まで幅広く活用できる記事になっています。この機会に是非活用していただければと思います。


Pythonを最短で習得したい方へ
元々ITリテラシーの高い方やプログラムの学び方がわかっている方であれば、この記事通りに進めていけば、Pythonを独学で習得することができるでしょう。

ただし、実際の学習期間中はつまづいている時間がほとんどです。

「なかなかやり遂げられ無い、挫折してしまった」
「時間が足りない」
「情報が少なくどう調べればいいかわからない」
「エラーを解決することができない」
このような悩みを抱えている方も少なく無いと思います。

  • もう挫折したくない
  • 本業と両立しながら、好きな時間で自分のペースで勉強を続けていきたい
  • 自分だけのカリキュラムで効率的に勉強したい
そんな方はお気軽に侍エンジニア塾までご相談ください。

お一人お一人に専属のインストラクターがつくので、通常のスクールでは難しい、AI(人工知能)や機械学習、IoTについて学習することできます。

まずは『無料体験レッスン』で、弊社のコンサルタントと一緒にあなた専用の学習方やカリキュラムを考えてみませんか?

Pythonならではの学習方法や、現役Pythonエンジニアから貴重なアドバイスを受けることができます。

詳しくは下の画像をクリックして弊社サービス内容をご確認ください。

cta_mtm_python

学習者インタビュー

人気記事セレクション

プログラミング学習者必見

専属講師に質問し放題、レッスンし放題!最短1ヶ月でフリーランスエンジニア
プログラミング学習カリキュラム無料公開中
Ruby学習カリキュラム無料公開中
Python学習カリキュラム無料公開中
 1記事最大11,000円!テックライター募集


LINEで送る
Pocket

この記事が気に入ったら
いいね!をしてフォローしよう

最新情報をお届けします

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com