【Python入門】ログ表示に便利!loggingモジュールを使ってみよう!

image (2)
長野 透
書いた人 長野 透

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

ログとは、プログラムの実行中に起こった出来事の情報の、時間経過に沿った記録のことです。

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

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

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

・ロギングとは
・loggingの基本的な使い方

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

・ログをファイルに出力する方法
・ログの出力形式を設定する方法
・例外をTracebackに出力する方法
・ログ設定ファイルの使い方

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

ロギングとは

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

Pythonでは、ログを取るためのloggingというモジュールが標準で用意されています。

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

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

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

これらの内容は、実行時に悪影響を及ぼす度合いによってレベル分けがされています。

そしてこのレベル分けを基準にして、どのレベルから履歴として残すかを選択出来ます。

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

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

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

またロギングする時には次のことに気をつけましょう。

・ログファイルの出力先
ログには重要な情報が出力されることもあるので、不特定のユーザーがアクセスできる場所には出力しないようにしましょう。

・ログメッセージ
日本語などのマルチバイト文字は環境によっては文字化けを起こすので、注意しましょう。

・フォーマット
ログの情報として実行時刻、ログ出力箇所、ログの種類、メッセージは出力するようにしましょう。

ロギング機能の使い方

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

基本的な使い方

ロギング機能を使うためには、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)のように、ログファイルの出力先をFileHandlerクラスのコンストラクタを使って設定しています。

FileHandlerコンストラクタの引数にログファイルの出力先を渡して、fhインスタンスを生成します。

fhインスタンスには、loggerオブジェクトのaddHandlerメソッドを使って設定を追加しています。

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

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

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

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

そこでログの出力形式を設定する方法を解説します。

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

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

実行結果

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

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

このformatterインスタンスをfhインストラクタ、shインストラクタのsetFormatterメソッドの引数に渡して出力形式の設定を登録しています。

この例では、「実行時間(年-月-日 時-分-秒,ミリ秒):行番号:ログレベル名:メッセージ文字列」の形式で出力されるような設定になっています。

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

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

例外をTracebackに出力しよう

エラー発生時にログが出力されるようなコードは、プログラミングでもよく書かれます。

その時にエラー情報として、Tracebackをログに出力したい場合はexceptionメソッドを用います。

Tracebackとは実行時エラーが発生したときに、エラーが発生したファイル名、行数、関数名、例外クラス名、エラー内容などを表示する機能のことです。

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

実行結果

このサンプルコードではゼロでの割り算によるエラーが発生し、「try-except」構文で例外処理を行っています。

try-exceptについての詳しい解説は、こちらの記事をご覧ください。

例外処理として、例外をログに表示しています。

まずはerrorメソッドを使用してログを出力しています。

errorメソッドの引数には例外クラスのオブジェクトを入力しています。

次にexceptionメソッドを使用して同じようにログを出力しています。

exceptionメソッドを使うとTracebackも含めてログに出力されます。

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

ログの設定は文字数が増えがちです。

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

そこで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

学習者インタビュー

23歳、早稲田中退生が3ヶ月でフリーランスエンジニアになるまで
元ベンチャー役員が起業のためにプログラミングを学んだ本当の理由
WEBデザイナーの僕がフリーランスエンジニアになれた理由
IT音痴のヨガインストラクターに超速でサイト作成したコツをきく
好きな場所で働きたい方、必見!パソコンとWifiさえあれば仕事はできる!
根っからの文系が経験0から3ヶ月でエンジニアに転身した方法

人気記事セレクション

WEBアプリ開発入門者がゼロからモノを作れるようになるまでの5ステップ
必ず見つかる!プログラミング言語は作りたいものから決めよう
プログラミング勉強ならコレ!無料学習サイトおすすめランキングTop5
プログラミング関連の案件が多いクラウドソーシングサイト5選
未経験でもフリーランスエンジニアになれる5つの理由
【入門者必見】WEBアプリ開発言語を選ぶべき3つの理由
Pythonでできることって!?大注目プログラミング言語徹底解説
【完全保存版】プログラミング初心者が最初にやるべき10のコト
ドットインストールで挫折せずに2ヶ月で未経験からエンジニアになった話

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

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

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

最新情報をお届けします

書いた人

長野 透

長野 透

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