システム方式設計書(アプリケーション方式設計書)にはどんなことを書くべきか?
必要だから作っているシステム設計書。
かけた労力の割に役に立っていない。
何のために書いているのかわからない。
なんてことはないでしょうか。
役に立つシステム方式設計を作るために必要なことを解説します。
今回は、ログ出力方式です。
ログ出力方式に書くこと
ログ出力方式にはログに出力したいことを中心に記載していくとよいでしょう。
ほかの方式設計と大きく異なる点は、要件の整理をすることが中心になります。
当サイトで推奨している構成では「概要」の記載が中心となります。
当サイトで推奨しているシステム方式設計の書き方は過去記事をご覧ください。
ログ出力の仕組みは、既存部品を利用することが多いので設計する項目は少ないです。
ログ出力部品を作成する場合は、しっかり設計をしてください。
ログ出力方式の「概要」に書くこと
出力するログに対する要件を整理します。
ログ出力は既存部品を使うことが多いので、部品の仕様を念頭に置いて実現可能な範囲で要件を決めていくといいでしょう。
具体的には次のような要件について決めていきましょう。
・ログの種類
・どのようなログレベルを設けるのか
・ログレベルごとの利用目的
・出力内容(フォーマット)
・ログレベルごとに出力する場所のルール
・ログ出力先(ファイルの出力先、DBなど)
・ログローテーションの要件
・ログ閲覧機能の要否
・定義ファイルについて(変更した時の反映タイミングなど)
ログの種類
ログの出力目的を整理します。
例えば次のようなイメージです。
エラーログ | エラーが起きたときに出力するログです。 |
稼働ログ | サービスの開始や終了を通知するためのログです。 |
トレースログ | システムの動作を追跡するためのログです。 プログラムの要所に仕込み、トラブルが起きたときにどこまでプログラムが動作したかを追跡するために使います。 |
デバッグログ | トラブルが起きたときに原因の追跡のために必要な情報を出力します。 |
アクセスログ | 利用者がログインした時などの記録を残すためのログです。 |
操作ログ | 利用者が行った操作を記録するためのログです。 エラーが起きたときになどに原因となる操作を追跡するために利用します。 |
ログレベル
ログの出力レベルを決めます。
ログの監視を行う場合は、ログレベルによってシステム管理者へ通知をしたりアラートを出すなどの仕組みを用意します。
FATAL | 想定外のエラーやシステムエラーが起きた場合 |
ERROR | システムは処理を継続できるレベルで、アプリケーションとして想定しているエラー |
WARN | システムの動作に問題はなく、警告として出力する必要がある場合 |
INFO | 処理の証跡や利用者の操作を残す場合 |
DEBUG | トラブルが起きたとき調査する場合に利用する。通常は出力せず、調査時に出力するように設定変更する。 |
ログの種類ごとにどのレベルで出力するのかも決めます。
FATAL | ERROR | WARN | INFO | DEBUG | |
エラーログ | 〇 | 〇 | 〇 | ||
稼働ログ | 〇 | 〇 | 〇 | 〇 | |
トレースログ | 〇 | ||||
デバッグログ | 〇 | ||||
アクセスログ | 〇 | ||||
操作ログ | 〇 | 〇 |
フォーマット
ログにどのような内容を出力するのかを決めます。
例えば、出力日時、クライアントのIPアドレス、エラーレベル、エラーの内容などです。
出力日時 | 出力対象にログを出力した日時 |
IPアドレス | クライアント側端末のIPアドレスを出力する |
コンピュータ名 | クライアント側端末のコンピュータ名を出力する |
OSバージョン | クライアント側端末のOSバージョンを出力する |
アプリケーションバージョン | クライアント側端末のアプリケーションバージョンを出力する |
アプリケーションID | クライアント側端末のアプリケーションIDを出力する |
アプリケーション名 | クライアント側端末のアプリケーション名を出力する |
クライアントログインID | クライアント側端末のクライアントログインIDを出力する |
クライアントMACアドレス | クライアント側端末のクライアントMACアドレスを出力する |
セションID | セションIDを出力する |
ログインID | ログインIDを出力する |
テナントID | テナントIDを出力する |
Webサーバ名 | Webサーバ名を出力 |
スレッドID | アプリケーションのスレッドIDを出力する |
プロセスID | アプリケーションのプロセスIDを出力する |
ログ出力日時 | アプリケーションでログが出力された日時を出力する |
レイヤー名 | アプリケーションでログを出力したレイヤー名を出力する |
クラス名 | アプリケーションでログを出力したクラス名を出力する |
クラス名(名前空間なし) | アプリケーションでログを出力したクラス名(名前空間なし)を出力する |
メソッド名 | アプリケーションでログを出力したメソッド名を出力する |
引数 | アプリケーションでログを出力したメソッドの引数を出力する |
ファイル名 | アプリケーションでログを出力したファイル名を出力する |
行番号 | アプリケーションでログを出力したクラスファイルの行番号を出力する |
追跡情報 | アプリケーションでログを出力したメソッドのメソッドのスタックトレースを出力する |
Publicフィールド | ログ出力時のPublic変数の値(データセットなど)を出力する |
発行SQL文 | 発行したSQL文を出力する |
ログレベル | ログ出力レベルを出力する |
メモリ使用量 | ログ出力時のメモリ使用量を出力する |
CPU使用率 | ログ出力時のCPU使用率を出力する |
メッセージ内容 | ログ出力時に設定したメッセージを出力する |
対処方法 | ログ出力時に入力した対処方法を出力する |
ログ出力場所
ログの出力をどのような場所に仕込むかを決めます。
例えばデバッグログの場合、各メソッドの開始と終了時に出力できるように仕込みをするなどのルールを決めます。
開発者はこのルールに従ってプログラム中にログの出力を実装する必要があります。
ログ出力先
ログを出力する先を決めます。
特定のフォルダにログファイルとして出力するのか。
その場合のファイル名などのルール。
もしくはDBへ出力するのかなどです。
ログローテーション
特にファイルにログを出力する場合、同じファイルに出ロクし続けるとログファイルが膨大になります。
定期的にログファイルを分けることを検討します。
ログ閲覧機能
出力したログをどのように閲覧するかを検討します。
ログを表示するためのアプリケーションを作成する場合もあります。
ログファイルがテキストファイルの場合、特に閲覧機能を用意しないこともあります。
定義ファイル
ログの出力内容や、出力の要否を制御する設定ファイルを設ける場合、どのような設定をするのか決めます。
また、システムの稼働中に定義ファイルを変更した場合、変更内容が反映されるタイミングも明確にします。
例えば、定義ファイルの内容を変更した瞬間に動作が変わるのか、システムを再起動したときに反映されるのかなどです。
ログ出力方式の「方式設計」に書くこと
ログ出力方式の方式設計にはログ出力の仕組みを書きましょう。
多くの場合は既存部品を使うのであまり書くことはありません。
構築するアプリケーションからログ出力部品を呼び出して、出力先の媒体までのつながりを絵にするなどでよいでしょう。
ログ部品を自作る場合は仕組みの設計をします。
ログ出力の場合はメインの処理とは非同期で出力する。
ログ出力部品でエラーが起きてもメイン処理には影響を与えない仕組み。
など、技術的にクリアする課題はたくさんあります。
ログ出力方式の「実装方式」に書くこと
実装方式に書くことは一つです。
ログ出力部品の使い方です。
設定するパラメータなど具体的に決めましょう。
ログ出力はいろいろな使い方をする必要はありません。
このシステムの中ではすべて同じ使い方になることが重要です。
コメント