どうも。キャッチアップの渕上です。こんにちはこんにちは!
今回の題材は「ログレベル」です。
キャッチアップでは、日々、Webシステムを開発し、そして運用しています。
その中でログは、開発中も、開発が終わり運用フェーズに移ったあとでも、様々な場面で重要なお役立ち情報になってきます。
ということで、日々のお役立ち情報として、ログレベルについて整理してみたいと思います。
なお、この記事はキャッチアップでは毎週水曜、社内勉強会を行ってまして、そのときに発表した内容のウケが良かったので、改めて書き起こした内容です。
(ウケたよね?)
積極的なログ出力
なにはともあれ、まずは積極的にログを出力したら良いよね、と行きたいところなのですが、せっかくなので、どのようなログ出力をしたら良いか、そしてどのようにログレベルを設定すると良いか。を整理してみたいと思います。
目的は、「どのレベルのログを、どう扱えばいいのか」を見える化することです。
ログレベルの基本セット
この5つをまず押さえておけば、どの場面で、どのようなログ出力をしたら良いか、の方針として役立てることができます。
レベル | 意味 | 例 |
---|---|---|
ALERT | 致命的エラー | サーバークラッシュ、データ消失 |
ERROR | 重大なエラー | DB接続エラー、致命的なバグ |
WARNING | 警告 | メモリ使用率90%、APIリトライ多発 |
NOTICE | 通常の情報 | ユーザーがログインした、設定変更した等 |
DEBUG | デバッグ情報 | リクエストパラメータや変数の中身など |
「ログレベル」ってそもそもどこから来た?
この記事を書くにあたって、改めてログの歴史を調べ直してみました。
https://ja.wikipedia.org/wiki/Syslog#%E6%AD%B4%E5%8F%B2
- syslogは、もともと1980年ごろにSendmailのログ記録のために生まれた仕組み
- 以降、他のアプリケーションでも採用されるようになり、現在ではUnix系システムの標準的なログ記録方式となっている
- その他のOSでも実装されており、ルータなどのネットワーク機器にもよく搭載されている
ログ記録システムとして、以下のようなログレベルが定義されており、これが現在のWebシステムのログレベル設計にも強く影響を与えているようです。
「emerg, alert, crit, err, warning, notice, info, debug」
値 | 重大度 | キーワード | 説明 | 状態 |
---|---|---|---|---|
0 | Emergency | emerg |
システム使用不可 | パニック状態 |
1 | Alert | alert |
早急な対処が必要 | システムのデータベースが破損しているなど、すぐに修正すべき状態 |
2 | Critical | crit |
致命的な状態 | ハードデバイスのエラー |
3 | Error | err |
エラー状態 | |
4 | Warning | warning |
警告状態 | |
5 | Notice | notice |
正常だが注意が必要な状態 | エラー状態ではないが、特別な処理を必要とする可能性のある状態 |
6 | Informational | info |
通知メッセージ | プログラムが期待通りに動作していることの確認 |
7 | Debug | debug |
デバッグメッセージ | 通常、プログラムのデバッグ時にのみ使用される情報を含むメッセージ |
身近な例としてのApacheのログレベル設定
ログレベルの概念が syslog から広がっていったことを紹介しましたが、実際にこのログレベルの考え方がどう使われているのか、身近な例を見てみましょう。
たとえば、Webサーバーである Apache ではどうなっているでしょうか?
Webサーバーとして多くの現場で使われている Apache にも、ログレベルの設定があります。
Apacheでは、ログの出力量をコントロールするために、「LogLevel」ディレクティブ を使って出力レベルの閾値を指定します。
例えば、次のような設定です。
LogLevel warn
このように設定することで、warn
よりも重大なレベル(たとえば error
や crit
など)のログが出力されるようになります。
指定したレベル以上の重要度を持つログのみを対象としてログに記録する仕組みです。
このような設定は、ログが多くなりがちな本番環境での運用では特に重要です。
たとえば、debug
や info
などを本番でも出力してしまうと、ディスク容量やログ転送の負荷が高まり、逆に 本当に必要なログが埋もれてしまう 可能性があります。
そのため、実運用では warn
や error
といったレベルに抑えて、必要な情報を見逃さず、かつノイズになり得る内容は減らすようにする、という運用が多いのではないでしょうか。
詳細は公式ドキュメントにも掲載されています。
👉 Apache公式ドキュメント LogLevel
レベル | 説明 | 例 |
---|---|---|
emerg |
緊急 - システムが利用できない | Child cannot open lock file. Exiting (子プロセスがロックファイルを開けないため終了した) |
alert |
直ちに対処が必要 | getpwuid: couldn't determine user name from uid (getpwuid: UID からユーザ名を特定できなかった) |
crit |
致命的な状態 | socket: Failed to get a socket, exiting child (socket: ソケットが得られないため、子プロセスを終了させた) |
error |
エラー | Premature end of script headers (スクリプトのヘッダが足りないままで終わった) |
warn |
警告 | child process 1234 did not exit, sending another SIGHUP (子プロセス 1234 が終了しなかった。もう一度 SIGHUP を送る) |
notice |
普通だが、重要な情報 | httpd: caught SIGBUS, attempting to dump core in ... (httpd: SIGBUS シグナルを受け、... へコアダンプをした) |
info |
追加情報 | "Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..." (「サーバは負荷が高い、 (StartServers や Min/MaxSpareServers の値を増やす必要があるかも)」) |
debug |
デバッグメッセージ | "Opening config file ..." (設定ファイルを開いている...) |
Webアプリケーション側でのログレベル
ApacheのようなWebサーバーでも活用されているログレベルは、アプリケーション側でも同様にログレベルの考え方を取り入れることができます。
ということで、私たちがよく使っているCakePHPのログレベルについても見てみました。
CakePHPでもログレベルは定義されていて、CakePHP5系のドキュメントには以下のように載ってます。
CakePHPの詳細はこちらです。
👉 https://book.cakephp.org/5/ja/core-libraries/logging.html#logging-levels
レベル | 意味 | 用途 |
---|---|---|
emergency | システムは使用出来ません | システムが使えない状態 |
alert | 今すぐ行動する必要がある | 今すぐ対応が必要な状態 |
critical | 致命的な状態 | 重大な状況 |
error | エラー状態 | 通常のエラー |
warning | 警告状態 | 警告 |
notice | 正常であるが、重大な状態 | 通常動作での情報 |
info | インフォメーションメッセージ | 細かい情報(システムの流れなど) |
debug | デバッグレベルメッセージ | デバッグ用 |
いかがでしょうか。
こうして並べてみてみると、非常に似通ったログレベルの定義となっていることがわかります。
つまり、ログレベルの考え方は、Webサーバーからアプリケーションまで、非常に似通ったものであることがわかります。
それでは、このログレベルの考え方を、実際にどのように使い分けているのか、見てみましょう。
実際にはどう使い分けているのか
これまでの流れを踏まえてようやく、冒頭で紹介した「ログレベルの基本セット」が元になります。
ここでは、私が日々の開発や運用の中で意識している目安を紹介します。
- ALERT
- サービスの提供継続が困難になるレベルの致命的な障害に使います。たとえば、データベース接続の喪失やディスクフルなどが該当します。
- ERROR
- 明らかに処理が失敗しているケースに使います。監視ツールの通知のトリガーとしての利用に用います。
- WARNING
- 即座に問題が起きるわけではないけれど、放っておくと不具合に繋がりそうな兆候を捉えるために使います。メモリ使用率の高騰、APIのリトライ回数増加などが該当します。
- NOTICE や INFO
- ユーザー操作やバッチ処理の開始・終了など、「正常だけど記録しておきたい」ものに使います。あとから「何が起きていたか」を辿るための材料になるログです。
- DEBUG
- 主に開発中に使うログです。本番環境では基本的に出力しません。たとえば、リクエストパラメータの中身や処理の流れなど、トラブル調査や確認のために一時的に仕込むようなログがこれにあたります。
このようにして、ログレベルごとに「誰のための情報か」「どのくらい緊急性があるか」を意識することで、ログを「あとから役立つ情報資産」として活かせるように努めています。
まとめ〜( ´ω`)
はい、まとめです。
ログレベルの基本的な種類とその意味、Webサーバーやアプリケーションにおける実例、そして実務での使い分け方について紹介してきました。
普段あまり意識せずに出しているログも、ログレベルを考慮するだけで、後々の運用・保守・トラブルシュートに役立つ場面が出てくるかもしれません。
開発の途中でも、本番運用中でも、「このログ、誰にとって、どれくらい重要なんだろう?」と考えてみるきっかけになればいいなぁ、と思ったりしてます。
ということで、今回は「あとで読むための資産」という観点からのログレベルの話でした。
(・∀・)< ログの設計、やってみませんか
現場からは以上です。
baserCMSやWebサイト構築のご相談など
お気軽にお問い合わせください