背景
アプリケーションのログはとても大事…ですよね。
開発中は影が薄いですが、運用中にはきちんと考えて出力できているログは頼りになります。
ただ、ログレベルの設定方法やログの監視方法などは様々なノウハウが共有されていますが、何を出力すべきか論じられているのは少ない印象です。
ワークロードの違いで出力すべきログが全然違ったりはしますが、多くのアプリケーションで共通となる部分もあると思っています。
この記事ではその共通部分の一つ、起動ログについて有用と思うことをまとめて書いています。
起動ログとは
ここでいう起動ログとは、バックエンドのデーモンやバッチなどでアプリケーションが正常起動したときに出力する情報です。
※ もしかしたら他に一般的な名称があるかも
私が書いているアプリケーションでは、起動すると以下のようなログを出力しています。
{
"level":"info",
"ts":"2022-07-21T05:21:15Z",
"msg": "startup",
"appName":"my_module",
"appVersion": "v1.0.0",
"option": "{\n \"Env\": \"production\",\n \"Port\": 80\n}"
}
起動ログに含める内容はだいたいどのアプリケーションでも同じになっています。
起動ログに含める情報
起動ログであることがわかる識別子
雰囲気でもわかるのですが、目印となる文字列を入れておくと後から検索しやすくなります。
(例では"msg": "startup"
)
読み込んでいる全ての設定
これが最も重要な情報と考えています。
検証済みのアプリケーションが意図したとおりに動作しない場合、
経験上多くは単純な設定のミス(項目名のタイプミスなど)であると思っています。
このようなミスは設定ファイルを眺めてもなかなか気づきにくいですが、起動ログに設定が出力されていれると、設定されているはずの項目が空文字列だったり、デフォルト値のままだったりして、かなり気づきやすくなります。
(例では"options"
の中にJSON文字列として保存)
アプリケーション名とバージョン
含めておくことで、起動するアプリケーションの取り違えがあったとき気づきやすくなります。
(例では"appName"
と"appVersion"
)
出力時刻
普通にログ出力すればでてくるので当然ですが、念のため。
古い起動ログを最新と誤認することを避けるため、確認できる必要があります。
(例では"ts"
)
起動ログの監視について
ログの出力先
各アプリケーションでの起動ログの出力先は、標準出力にしています。
他のログと同様に扱い、適当な手段で集約して検索可能にします。
通知はあった方がいいかも
自分のプロジェクトでは起動ログで通知が出るようにしています。
以下の目的をもっています。
- 意図しないエラーで、エラー自体の通知がなくアプリケーションが落ちた場合、再起動のログで何か起きた可能性を察知できる
- その他にも、とにかく把握していないところでのアプリケーションの起動に気付ける
わざわざアプリケーション起動で通知しなくても安心して運用できれば理想的だとは思うのですが、未知の不具合やセキュリティの考慮漏れなどの対策の一環として、通知するようにしています。
まとめ
起動ログが出力されていると、設定ファイルと実設定の齟齬を把握しやすくなり、便利です。
どのアプリケーションでもほぼ共通の考えで設定でき、特に設置時の不具合調査が非常に楽になるのでコストパフォーマンスがよいログだと思います。