アプリケーションログの設計・管理について

現代の情報システムにおいては多種のアプリケーションが動いています。
Webサーバーやデータベース等、多くのシステムで利用されている販売されているアプリケーションや無料のアプリケーション、システムごとの個別に開発されたアプリケーションも多種あります。

それらのアプリケーションが意図せずエラーを起こしてしまう事があります。その時に必要となるのがアプリケーションログです。

そこで今回はアプリケーションログとは何か?というところから利用法、必要性、必要となる情報など詳しく見ていきます。
是非最後までご覧ください。

アプリケーションログとは何か?

先述したように現代社会において様々なアプリケーションが動いていますが、これらのアプリケーションの動作の状況をアプリケーション自身が自分のファイルに記録しているものがアプリケーションログです。

アプリケーションログはそのアプリケーションの動作の状況を確認するために開発者や運用者にとって無くてはならない情報源です。
そのため、ログを記録していないアプリケーションはまずないでしょう。

ログの形式は多岐にわたりますが、Windows上で動くIISやSQL Serverなどの商用アプリケーションの多くは、Windowsイベントログとしてログを記録します。

UNIX系のOSで多用されているApacheやMySQL等のアプリケーションの多くはテキスト形式のログファイルを決まっているディレクトリに記録します。

アプリケーションがエラーや動作に問題が発生した時にアプリケーションログをを確認する場合は、その問題の原因を突き止めるためのログメッセージを早急に見つける事が重要です。

アプリケーションログ作成の目的

目的として真っ先に思い浮かぶのは障害時の対策の為と言う事ですが、その他にもあります。
ひとつひとつ見ていきましょう。

障害時対策

システムに障害が発生した場合、保存してあるログが唯一の手掛かりです。ログの保存が無いシステムは障害解析は全くできないでしょう。
実際に起こっている障害の結果だけを見て全ての原因まで推測できるのであればログは不要です。

しかし、現代の情報システムは責務が細かくなっており、膨大なコンポーネントの集まりによって動作していますので障害調査をログなしで行うと言う事は不可能と言っても過言ではないでしょう。

障害予兆対策

実際に障害は起きていないが、その余長を検知して早急に対策をするためにもログは必要です。
アプリケーションログを見て、早急に対策を練り事前に解決させます。

システム動作の把握

現在のシステムの動作を把握し、今後の開発の効率を上げます
また、行動ログより。アプリケーション改善の指針を定めるために使用されることもあります。

アプリケーションログの出力先

アプリケーションログはシステム運用担当者がすぐに見つけられる場所に出力するのが望ましいです。
ファイルに出力の場合は/Var/logなど、すぐに気づくわかりやすいディレクトリに出力の上、適切なパーミッションの設定が必要です。

アプリケーションログにはシステムの内部の部外秘の重要な情報が出力される事もあるので、Webの公開ディレクトリやパーミッション777のディレクトリ等の、不特定多数のユーザーがアクセス出来る場所に出力してはなりません

 

標準出力 主にバッチ処理実装のバッチアプリケーションなど、コンソールから起動する場合で、途中の経過を出力する際に使用する
標準エラー出力 主にバッチアプリケーションなど、コンソールから起動する場合で、エラーが起こった場合等に使用する。
標準出力に実行の結果を出力する時は途中経過等に使用される時もある
ファイル 主としてコンソール以外で起動されるアプリケーションに使われる。

アプリーケーションログを出力する要件

出力項目

ログには以下のような項目を出力します。

・処理日時

・ユーザーIDなどのアクセス元情報

・URL、Webページ名やスクリプトIDなどのアクセス対象

・閲覧、変更や削除等のユーザーの操作内容

・リソースIDやカテゴリーID等の捜査対象

・操作の結果(その操作は成功か失敗か、処理件数など)

・アプリケーションのクラッシュの情報

・Stacktraceなど

上記はもちろん一例です。
実際の現場に即した項目を追加してください。

ログレベル

当然の事ですが、出来る限り詳細のログがあった方が良いです。しかしながら本番の環境ではログの出力に対するコストが発生するために、ログの緊急度及び用途によりログレベルを設定し、環境により適切にログを出力します。

レベル 意味合い 説明
FATAL 回復不可能なエラー プログラムの異常終了を伴うようなレベルのエラー。
コンソールなどに即出力するなどし即時の対応が求められます。
ERROR エラー DBサーバー無応答など、本来発生しない予期しない処理が発生。コンソールなどに即出力する。
WARN 警告 廃要素のAPIの使用。APIの不適切な使用、エラーに近い現象など、通常発生しないが想定内の問題処理の発生。異常と断定できないが、正常ではない何らかの予期しない問題の発生。
INFO 情報 アプリケーションが起動した情報やログインの際のユーザーID等、毎回出力させるべきイベントの発火・事実を出力(開始、終了など)。
DEBUG デバッグ用の情報 セッション内部の情報やユーザーHTTPリクエスト、レスポンスの情報等、システムの動作状況の詳しい情報、開発時に参考となる情報の出力
TRACE トレース情報 ループ内部の変数等、デバッグ情報よりも更に詳しい情報。メソッドのパラメータ値や変数値、ロジック終了後の変数値など、かなり詳細の情報

ログに出力すべきではない情報

昨今、個人情報の保護の重要性が増しています。ログには「氏名」や「住所」などの個人を特定できる個人情報及び「電話番号」「メールアドレス」「SNSのアカウント情報」等インターネット上で個人と連絡をとったり個人の居住地等を突き止める事が可能な情報をそのまま出力してはなりません
その他パスワードも平文で出力してはなりません

また、不正アクセスの要因となるようなセッションIDやアクセストークン、OAuth等の情報も出力を避けるべきです。

各々の個人情報保護指針に準則し、下記のような対策をしましょう。

1.そもそも個人情報、インターネット上の個人情報やパスワードは出力しない

2.マスキングをを行った上で出力する

3.識別性の維持が必要な場合は一方向ハッシュ関数を使用し符号化の上出力する

※個人情報に関してはSQL分を含めて注意する事が必要です。

ログフォーマット

ログフォーマットは見やすさ、扱いやすさなど運用を考慮したフォーマットを心がけましょう。
ログには日時(年・月・日・秒・ミリ秒)を出力します。

出力項目に関しては下記に一例を示しますが、各々出せるもの、出したいもの等を適時選定してください。

・ログの出力日時
・スレッド
・ログレベル
・ロガー名
・ユーザーID
・セッションID
・アクセスURL
・ログメッセージ

ログローテーション

ログローテーションとはシステム上の時系列のログが果てしなく増える事を防止するために、一定の容量や期間で過去のログを削除する事です。
過去ログに新しいログを上書きする事もあります。

ログをディスクに保存する場合はディスクの容量が枯渇する事の無いようログローテーションを導入します。
ログの種類、容量や解析のタイミングを考慮に入れ、ローテーションの間隔を決定します。
また、必要に応じ圧縮処理の必要性においても吟味する。

まとめ

今回はアプリケーションログとは何か?というところから利用法、必要性、必要となる情報など詳しく見ていきました。
いかがでしたでしょうか?

万が一の事態が起きた場合、アプリケーションログが無ければ復旧もままなりません。
アプリケーションログに関してはその現場や状況に応じて必要な情報も変わってきますので、そこを考慮して調整していきましょう。

BLOGコンテンツをパーソナライズします

あなたは現在「プログラミング学習者」ですか?