プログラム開発でバグが見つかった際、もっと早く修正箇所を見つけられるようになりたいなぁ。。。
こんにちはJun(@JunNomad)です。
プログラム開発で原因の分からないバグが発生して、丸一日無駄にしてしまったなんてプログラマーの方も多いのではないでしょうか。
今回はプログラム開発において必須知識であるログ出力について、初心者プログラマーの方向けに解説していきたいと思います。
ログを出力する目的は?
ログを出力する主な目的として、下記の4つが挙げられます。
- トラブルシューティング
- 監視
- 解析
- 統計
トラブルシューティング
プログラム開発において、エラーが発生した際、真っ先に確認しないといけないのが「ログ」です。
エラーを解決するためのトラブルシューティングにおいて、必須となるためログ出力は欠かせません。
監視
プログラムが動作しているのか、不具合が起きていないかを監視する役目もログは担います。
目視やプログラムで定期的にチェックしておくことで、何か問題が起きた際にいち早く気づくことが可能となります。
解析
ログはアクセス情報などを解析することで、マーケティングに繋げたり、事業の改善に役立てることも可能です。
どんな地域からアクセスされているのか、どの時間にユーザーが多く訪問しているのかなど様々な情報を取得することが出来ます。
統計
アクセスログを活用して、統計情報を確認することも可能です。
ログの出力内容をプログラムで定義しておくことで、統計情報をログに組み込んだりすることも可能となります。
ログから取得出来る情報とは
ログから取得出来る情報には、設定にもよりますが、様々な情報を得ることが可能です。
サーバーの情報
まずシステムを動かすサーバー上の情報を得ることが可能です。
サーバーへのアクセス情報やエラー状況、ユーザー認証の成功・失敗、OSの動作状況からリソース状況など、たくさんの情報が得られます。
データベースの情報
データベースの情報では、発行されたSQLや取得出来たデータの情報などを取得可能です。
もちろん上述した通り、データベース用サーバーの情報も同じく取得出来ます。
ネットワークの情報
クライアントとサーバーの通信状況など、ネットワークの接続情報についても確認することが可能です。
ネットワーク不良により起こるエラーも少なくないため、必須でチェックすべき情報と言えます。
オブジェクトに定義された具体的な値
エラー解決のためでいうと、オブジェクトに定義された具体的な値をログとして出力することも、プログラムで定義しておけば可能です。
特にユーザーがインプットしたデータの情報やアウトプット情報などはエラーの原因となることが多いため、無駄に処理が重くならない範囲でログ情報として出力しておくのも悪くないかも知れませんね。
ログの出力レベルを把握しよう
ログの出力レベルは、利用するライブラリやファンクションにより異なりますが、一般的に下記の5つが基本とされています。
Debug
開発時のデバッグ情報として主に利用されます。
一般的に本番環境ではDebugに設定されたレベルのログは出力しません。
Info
一応ログとして残しておきたいような情報を出力します。
本番環境でも出力されるよう設定されていることも多いですが、一般的にシステム管理者に通知するようなことはしません。
Warn
何らかの問題が起きてはいるがユーザー起因のエラーで、システムに問題がないようなエラーとして設定されます。
Warnもログとしては出力しますが、かなり厳しく管理されたシステム以外では管理への通知は行いません。
Error
システムが原因で何らかの問題が起きた際に出力されるエラーログです。
ただし、頻出しない限りは放置しておいても問題ないようなエラーの場合に設定されます。
管理者へは基本的に通知するレベルですが、対処は管理者の判断に任せられることが多くなります。
Fatal
システムダウンなど、早急に対処が必要なレベルのエラーで出力されるログです。
管理者には即座に連絡がいくように設定しておくべきログ内容です。
この出力レベルのエラーでは、トラブルシューティングがスムーズに行えるように、なるべく詳細な情報を出力するよう設定しておきます。
ログの出力内容サンプル
ログの出力内容は、プログラムやライブラリにより異なりますが一般的に下記のような構成で出力されます。
[タイムスタンプ] [ログレベル] [処理内容] [エラー内容]
具体的なサンプルとしては下記のような形式です。
実際の環境では、何行にも渡って細かく情報が出力されます。
2020/10/08 19:00:00 ERROR ログイン処理 データベースに接続出来ません。
エラー発生時に確認しておきたい情報
エラー発生時には、スムーズに原因を特定するために抑えておきたい情報がいくつか存在します。
インプット情報
まず多くのエラーの原因となるのが、何らかの処理のインプットデータに予期せぬデータが送られているケースです。
実際にエラーとなった処理を特定し、インプット情報を確認することは重要です。
エラー発生状況
エラーが発生した際の、時間や環境などもエラー調査をする上で欠かせません。
エラーを再現するためには、発生状況になるべく100%近づける必要があります。
環境の影響を受けた事によるエラーなのか、そもそもシステム自体がバグを潜ませていたのかによっても対応すべき方法は変わります。
さいごに:ログ出力を理解してプログラム開発の効率を上げよう!
本記事では、プログラム開発における「ログ出力」に関しての情報をプログラム初心者の方向けにご紹介してきました。
エラーが発生した際のトラブルシューティングはもちろん、プログラム開発中のデバッグなどでもログを活用することで効率的に行うことが可能となります。
ぜひログの役割をしっかりと理解し、プログラム開発の効率を上げ、バグのないシステム開発を目指しましょう。