7.1.1.2.4. HTTPアクセスログの出力¶
HTTPアクセスログは、フレームワークが提供するハンドラを使用して出力する。 アプリケーションでは、ハンドラの設定を行うことでHTTPアクセスログを出力する。
HTTPアクセスログの出力に必要となるハンドラは以下のとおり。
- HTTPアクセスログハンドラ
- リクエスト処理開始時と終了時のログ出力を行う。
- Nablarchカスタムタグ制御ハンドラ
- hiddenパラメータ復号後のログ出力を行う。 hiddenパラメータについては、 hidden暗号化 を参照。
- HTTPリクエストディスパッチハンドラ
- ディスパッチ先クラス決定後のログ出力を行う。
リクエストパラメータを含めたリクエスト情報を出力することで、 個別アプリケーションの証跡ログの要件を満たせる場合は、HTTPアクセスログと証跡ログを兼用することも想定している。
7.1.1.2.4.1. HTTPアクセスログの出力方針¶
HTTPアクセスログは、アプリケーション全体のログ出力を行うアプリケーションログに出力する。
ログレベル | ロガー名 |
---|---|
INFO | HTTP_ACCESS |
上記出力方針に対するログ出力の設定例を下記に示す。
- log.propertiesの設定例
writerNames=appLog # アプリケーションログの出力先 writer.appLog.className=nablarch.core.log.basic.FileLogWriter writer.appLog.filePath=/var/log/app/app.log writer.appLog.encoding=UTF-8 writer.appLog.maxFileSize=10000 writer.appLog.formatter.className=nablarch.core.log.basic.BasicLogFormatter writer.appLog.formatter.format=$date$ -$logLevel$- $runtimeLoggerName$ [$executionId$] boot_proc = [$bootProcess$] proc_sys = [$processingSystem$] req_id = [$requestId$] usr_id = [$userId$] $message$$information$$stackTrace$ availableLoggersNamesOrder=ACC,ROO # アプリケーションログの設定 loggers.ROO.nameRegex=.* loggers.ROO.level=INFO loggers.ROO.writerNames=appLog # HTTPアクセスログの設定 loggers.ACC.nameRegex=HTTP_ACCESS loggers.ACC.level=INFO loggers.ACC.writerNames=appLog
- app-log.propertiesの設定例
# HttpAccessLogFormatter #httpAccessLogFormatter.className= #httpAccessLogFormatter.datePattern= #httpAccessLogFormatter.maskingChar= #httpAccessLogFormatter.maskingPatterns= #httpAccessLogFormatter.parametersSeparator= #httpAccessLogFormatter.sessionScopeSeparator= #httpAccessLogFormatter.beginOutputEnabled= #httpAccessLogFormatter.parametersOutputEnabled= #httpAccessLogFormatter.dispatchingClassOutputEnabled= #httpAccessLogFormatter.endOutputEnabled= httpAccessLogFormatter.beginFormat=@@@@ BEGIN @@@@ rid = [$requestId$] uid = [$userId$] sid = [$sessionId$]\ \n\turl = [$url$$query$]\ \n\tmethod = [$method$]\ \n\tport = [$port$]\ \n\tclient_ip = [$clientIpAddress$]\ \n\tclient_host = [$clientHost$] httpAccessLogFormatter.parametersFormat=@@@@ PARAMETERS @@@@\n\tparameters = [$parameters$] httpAccessLogFormatter.dispatchingClassFormat=@@@@ DISPATCHING CLASS @@@@ class = [$dispatchingClass$] httpAccessLogFormatter.endFormat=@@@@ END @@@@ rid = [$requestId$] uid = [$userId$] sid = [$sessionId$] url = [$url$$query$] method = [$method$] status_code = [$statusCode$] content_path = [$contentPath$]\ \n\tstart_time = [$startTime$]\ \n\tend_time = [$endTime$]\ \n\texecution_time = [$executionTime$]\ \n\tmax_memory = [$maxMemory$]\ \n\tfree_memory = [$freeMemory$]
7.1.1.2.4.2. 使用方法¶
7.1.1.2.4.2.1. HTTPアクセスログの設定を行う¶
HTTPアクセスログの設定は、 各種ログの設定を行う で説明したプロパティファイルに行う。
- 記述ルール
-
- httpAccessLogFormatter.className
- HttpAccessLogFormatter を実装したクラス。 差し替える場合に指定する。
- httpAccessLogFormatter.beginFormat
リクエスト処理開始時のログ出力に使用するフォーマット。
- フォーマットに指定可能なプレースホルダ
リクエストID: $requestId$ ユーザID: $userId$ URL: $url$ クエリ文字列: $query$ ポート番号: $port$ HTTPメソッド: $method$ セッションID: $sessionId$ リクエストパラメータ: $parameters$ セッションスコープ情報: $sessionScope$ クライアント端末IPアドレス: $clientIpAddress$ クライアント端末ホスト: $clientHost$ HTTPヘッダのUser-Agent: $clientUserAgent$ リクエストパラメータ: $parameters$ - デフォルトのフォーマット
@@@@ BEGIN @@@@ rid = [$requestId$] uid = [$userId$] sid = [$sessionId$] \n\turl = [$url$] \n\tmethod = [$method$] \n\tport = [$port$] \n\tclient_ip = [$clientIpAddress$] \n\tclient_host = [$clientHost$]
補足
リクエストパラメータは、 hidden暗号化 の復号前の状態となる。
重要
リクエストIDとユーザIDは、 BasicLogFormatter が出力する項目と重複するが、HTTPアクセスログのフォーマットの自由度を高めるために設けている。
リクエストID、ユーザIDを出力する場合は、 これらの取得元が ThreadContext なので、 ハンドラ構成に スレッドコンテキスト変数管理ハンドラ が含まれている必要がある。 特にユーザIDについては、 ユーザIDを設定する を参照して アプリケーションでセッションに値を設定する必要がある。
- httpAccessLogFormatter.parametersFormat
hiddenパラメータ復号後のログ出力に使用するフォーマット。
- フォーマットに指定可能なプレースホルダ
- 「リクエスト処理開始時のログ出力に使用するフォーマット」と同じため省略。
- デフォルトのフォーマット
@@@@ PARAMETERS @@@@ \n\tparameters = [$parameters$]
- httpAccessLogFormatter.dispatchingClassFormat
ディスパッチ先クラス決定後のログ出力に使用するフォーマット。
- フォーマットに指定可能なプレースホルダ
ディスパッチ先クラス: $dispatchingClass$ - デフォルトのフォーマット
@@@@ DISPATCHING CLASS @@@@ class = [$dispatchingClass$]
- httpAccessLogFormatter.endFormat
リクエスト処理終了時のログ出力に使用するフォーマット。
- フォーマットに指定可能なプレースホルダ
ディスパッチ先クラス: $dispatchingClass$ ステータスコード(内部): $statusCode$ ステータスコード(クライアント): $responseStatusCode$ コンテンツパス: $contentPath$ 開始日時: $startTime$ 終了日時: $endTime$ 実行時間: $executionTime$ 最大メモリ量: $maxMemory$ 空きメモリ量(開始時): $freeMemory$ - デフォルトのフォーマット
@@@@ END @@@@ rid = [$requestId$] uid = [$userId$] sid = [$sessionId$] url = [$url$] status_code = [$statusCode$] content_path = [$contentPath$] \n\tstart_time = [$startTime$] \n\tend_time = [$endTime$] \n\texecution_time = [$executionTime$] \n\tmax_memory = [$maxMemory$] \n\tfree_memory = [$freeMemory$]
補足
ステータスコード(内部)は、 HTTPアクセスログハンドラ の復路時点でのステータスコードのことを指す。 ステータスコード(クライアント)は、 HTTPレスポンスハンドラ で、クライアントに返却するステータスコードのことを指す。
ステータスコード(クライアント)は、本ログ出力時点では確定していないが、 HTTPレスポンスハンドラ と同じ機能を使い、 ステータスコード(クライアント)を導出しログ出力を行う。
ステータスコードの変換ルールは、 カスタムレスポンスライター を参照。
重要
ステータスコード(クライアント)
の値は、 HTTPアクセスログハンドラの処理の後にJSPのエラーなどシステムエラーが発生した場合、 実際の内部コードと異なることがある。この場合、システムエラーとして別途障害監視ログが出力されるため、 障害監視ログが発生した際にはこの値が正しくない可能性があることを考慮してログを検証すること。- httpAccessLogFormatter.datePattern
- 開始日時と終了日時に使用する日時パターン。
パターンには、 SimpleDateFormat が規程している構文を指定する。
デフォルトは
yyyy-MM-dd HH:mm:ss.SSS
。 - httpAccessLogFormatter.maskingPatterns
- マスク対象のパラメータ名又は変数名を正規表現で指定する。
複数指定する場合はカンマ区切り。
リクエストパラメータとセッションスコープ情報の両方のマスキングに使用する。
指定した正規表現は大文字小文字を区別しない。
例えば、
password
と指定した場合、password
newPassword
password2
等にマッチする。 - httpAccessLogFormatter.maskingChar
- マスクに使用する文字。デフォルトは
*
。 - httpAccessLogFormatter.parametersSeparator
- リクエストパラメータのセパレータ。
デフォルトは
\n\t\t
。 - httpAccessLogFormatter.sessionScopeSeparator
- セッションスコープ情報のセパレータ。
デフォルトは
\n\t\t
。 - httpAccessLogFormatter.beginOutputEnabled
- リクエスト処理開始時の出力が有効か否か。 デフォルトはtrue。 falseを指定するとリクエスト処理開始時の出力を行わない。
- httpAccessLogFormatter.parametersOutputEnabled
- hiddenパラメータ復号後の出力が有効か否か。 デフォルトはtrue。 falseを指定するとhiddenパラメータ復号後の出力を行わない。
- httpAccessLogFormatter.dispatchingClassOutputEnabled
- ディスパッチ先クラス決定後の出力が有効か否か。 デフォルトはtrue。 falseを指定するとディスパッチ先クラス決定後の出力を行わない。
- httpAccessLogFormatter.endOutputEnabled
- リクエスト処理終了時の出力が有効か否か。 デフォルトはtrue。 falseを指定するとリクエスト処理終了時の出力を行わない。
- 記述例
httpAccessLogFormatter.className=nablarch.fw.web.handler.HttpAccessLogFormatter httpAccessLogFormatter.beginFormat=> sid = [$sessionId$] @@@@ BEGIN @@@@\n\turl = [$url$]\n\tmethod = [$method$] httpAccessLogFormatter.parametersFormat=> sid = [$sessionId$] @@@@ PARAMETERS @@@@\n\tparameters = [$parameters$] httpAccessLogFormatter.dispatchingClassFormat=> sid = [$sessionId$] @@@@ DISPATCHING CLASS @@@@ class = [$dispatchingClass$] httpAccessLogFormatter.endFormat=< sid = [$sessionId$] @@@@ END @@@@ url = [$url$] status_code = [$statusCode$] content_path = [$contentPath$] httpAccessLogFormatter.datePattern="yyyy-MM-dd HH:mm:ss.SSS" httpAccessLogFormatter.maskingChar=# httpAccessLogFormatter.maskingPatterns=password,mobilePhoneNumber httpAccessLogFormatter.parametersSeparator=, httpAccessLogFormatter.sessionScopeSeparator=, httpAccessLogFormatter.beginOutputEnabled=true httpAccessLogFormatter.parametersOutputEnabled=true httpAccessLogFormatter.dispatchingClassOutputEnabled=true httpAccessLogFormatter.endOutputEnabled=true