HTTPアクセスログの出力¶
HTTPアクセスログは、フレームワークが提供するハンドラを使用して出力する。 アプリケーションでは、ハンドラを設定することでHTTPアクセスログを出力する。
HTTPアクセスログの出力に必要となるハンドラは以下のとおり。
- HTTPアクセスログハンドラ
- リクエスト処理開始時と終了時のログ出力を行う。
- Nablarchカスタムタグ制御ハンドラ
- hiddenパラメータ復号後のログ出力を行う。 hiddenパラメータについては、 hidden暗号化 を参照。
- HTTPリクエストディスパッチハンドラ
- ディスパッチ先クラス決定後のログ出力を行う。
リクエストパラメータを含めたリクエスト情報を出力することで、 個別アプリケーションの証跡ログの要件を満たせる場合は、HTTPアクセスログと証跡ログを兼用することも想定している。
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$]
使用方法¶
HTTPアクセスログの設定¶
HTTPアクセスログの設定は、 各種ログの設定 で説明したプロパティファイルに行う。
- 記述ルール
-
- httpAccessLogFormatter.className
- HttpAccessLogFormatter を実装したクラス。 差し替える場合に指定する。
- httpAccessLogFormatter.beginFormat
リクエスト処理開始時のログ出力に使用するフォーマット。
- フォーマットに指定可能なプレースホルダ
リクエストID: $requestId$ ユーザID: $userId$ URL: $url$ クエリ文字列: $query$ ポート番号: $port$ HTTPメソッド: $method$ HTTPセッションID: $sessionId$ セッションストアID: $sessionStoreId$ リクエストパラメータ: $parameters$ セッションスコープ情報: $sessionScope$ クライアント端末IPアドレス: $clientIpAddress$ クライアント端末ホスト: $clientHost$ HTTPヘッダのUser-Agent: $clientUserAgent$ - デフォルトのフォーマット
@@@@ 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$ セッションストアID: $sessionStoreId$ - デフォルトのフォーマット
@@@@ DISPATCHING CLASS @@@@ class = [$dispatchingClass$]
- httpAccessLogFormatter.endFormat
リクエスト処理終了時のログ出力に使用するフォーマット。
- フォーマットに指定可能なプレースホルダ
ディスパッチ先クラス: $dispatchingClass$ ステータスコード(内部): $statusCode$ ステータスコード(クライアント): $responseStatusCode$ コンテンツパス: $contentPath$ 開始日時: $startTime$ 終了日時: $endTime$ 実行時間: $executionTime$ 最大メモリ量: $maxMemory$ 空きメモリ量(開始時): $freeMemory$ セッションストアID: $sessionStoreId$ - デフォルトのフォーマット
@@@@ 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
JSON形式の構造化ログとして出力する¶
JSON形式の構造化ログとして出力する 設定によりログをJSON形式で出力できるが、 HttpAccessLogFormatter では HTTPアクセスログの各項目はmessageの値に文字列として出力される。 HTTPアクセスログの各項目もJSONの値として出力するには、 HttpAccessJsonLogFormatter を使用する。 設定は、 各種ログの設定 で説明したプロパティファイルに行う。
- 記述ルール
HttpAccessJsonLogFormatter を用いる際に 指定するプロパティは以下の通り。
- httpAccessLogFormatter.className
必須
- JSON形式でログを出力する場合、 HttpAccessJsonLogFormatter を指定する。
- httpAccessLogFormatter.beginTargets
リクエスト処理開始時のログ出力項目。カンマ区切りで指定する。
- 指定可能な出力項目およびデフォルトの出力項目
ラベル: label デフォルト
リクエストID: requestId デフォルト
ユーザID: userId デフォルト
HTTPセッションID: sessionId デフォルト
セッションストアID: sessionStoreId URL: url デフォルト
ポート番号: port デフォルト
HTTPメソッド: method デフォルト
クエリ文字列: queryString リクエストパラメータ: parameters セッションスコープ情報: sessionScope クライアント端末IPアドレス: clientIpAddress デフォルト
クライアント端末ホスト: clientHost デフォルト
HTTPヘッダのUser-Agent: clientUserAgent
出力項目の詳細は、 リクエスト処理開始時のログ出力に使用するフォーマット のプレースホルダーと同じため省略。
- httpAccessLogFormatter.parametersTargets
- hiddenパラメータ復号後のログ出力項目。カンマ区切りで指定する。
指定可能な出力項目は、
リクエスト処理開始時の出力項目 と同じため省略。
デフォルトの出力項目は
label,parameters
となる。 - httpAccessLogFormatter.dispatchingClassTargets
ディスパッチ先クラス決定後のログ出力項目。カンマ区切りで指定する。
- 指定可能な出力項目およびデフォルトの出力項目
ラベル: label デフォルト
HTTPセッションID: sessionId セッションストアID: sessionStoreId ディスパッチ先クラス: dispatchingClass デフォルト
- httpAccessLogFormatter.endTargets
リクエスト処理終了時のログ出力項目。カンマ区切りで指定する。
- 指定可能な出力項目およびデフォルトの出力項目
ラベル: label デフォルト
リクエストID: requestId デフォルト
ユーザID: userId デフォルト
HTTPセッションID: sessionId デフォルト
セッションストアID: sessionStoreId URL: url デフォルト
ディスパッチ先クラス: dispatchingClass ステータスコード(内部): statusCode デフォルト
ステータスコード(クライアント): responseStatusCode コンテンツパス: contentPath デフォルト
開始日時: startTime デフォルト
終了日時: endTime デフォルト
実行時間: executionTime デフォルト
最大メモリ量: maxMemory デフォルト
空きメモリ量(開始時): freeMemory デフォルト
出力項目の詳細は、 リクエスト処理終了時のログ出力に使用するフォーマット のプレースホルダーと同じため省略。
- httpAccessLogFormatter.datePattern
- 開始日時と終了日時に使用する日時パターン。
パターンには、 SimpleDateFormat が規程している構文を指定する。
デフォルトは
yyyy-MM-dd HH:mm:ss.SSS
。 - httpAccessLogFormatter.maskingPatterns
- マスク対象のパラメータ名又は変数名を正規表現で指定する(部分一致)。
複数指定する場合はカンマ区切り。
リクエストパラメータとセッションスコープ情報の両方のマスキングに使用する。
指定した正規表現は大文字小文字を区別しない。
例えば、
password
と指定した場合、password
newPassword
password2
等にマッチする。 - httpAccessLogFormatter.maskingChar
- マスクに使用する文字。デフォルトは
*
。 - httpAccessLogFormatter.beginOutputEnabled
- リクエスト処理開始時の出力が有効か否か。 デフォルトはtrue。 falseを指定するとリクエスト処理開始時に出力しない。
- httpAccessLogFormatter.parametersOutputEnabled
- hiddenパラメータ復号後の出力が有効か否か。 デフォルトはtrue。 falseを指定するとhiddenパラメータ復号後に出力しない。
- httpAccessLogFormatter.dispatchingClassOutputEnabled
- ディスパッチ先クラス決定後の出力が有効か否か。 デフォルトはtrue。 falseを指定するとディスパッチ先クラス決定後に出力しない。
- httpAccessLogFormatter.endOutputEnabled
- リクエスト処理終了時の出力が有効か否か。 デフォルトはtrue。 falseを指定するとリクエスト処理終了時に出力しない。
- httpAccessLogFormatter.beginLabel
- リクエスト処理開始時ログのlabelに出力する値。
デフォルトは
"HTTP ACCESS BEGIN"
。 - httpAccessLogFormatter.parametersLabel
- hiddenパラメータ復号後ログのlabelに出力する値。
デフォルトは
"PARAMETERS"
。 - httpAccessLogFormatter.dispatchingClassLabel
- ディスパッチ先クラス決定後ログのlabelに出力する値。
デフォルトは
"DISPATCHING CLASS"
。 - httpAccessLogFormatter.endLabel
- リクエスト処理終了時ログのlabelに出力する値。
デフォルトは
"HTTP ACCESS END"
。 - httpAccessLogFormatter.structuredMessagePrefix
- フォーマット後のメッセージ文字列が JSON 形式に整形されていることを識別できるようにするために、メッセージの先頭に付与するマーカー文字列。
メッセージの先頭にあるマーカー文字列が JsonLogFormatter に設定しているマーカー文字列と一致する場合、 JsonLogFormatter はメッセージを JSON データとして処理する。
デフォルトは
"$JSON$"
となる。 変更する場合は、LogWriterのstructuredMessagePrefix
プロパティを使用して JsonLogFormatter にも同じ値を設定すること(LogWriterのプロパティについては ログ出力の設定 を参照)。
- httpAccessLogFormatter.className
- 記述例
httpAccessLogFormatter.className=nablarch.fw.web.handler.HttpAccessJsonLogFormatter httpAccessLogFormatter.structuredMessagePrefix=$JSON$ httpAccessLogFormatter.beginTargets=sessionId,url,method httpAccessLogFormatter.parametersTargets=sessionId,parameters httpAccessLogFormatter.dispatchingClassTargets=sessionId,dispatchingClass httpAccessLogFormatter.endTargets=sessionId,url,statusCode,contentPath httpAccessLogFormatter.beginLabel=HTTP ACCESS BEGIN httpAccessLogFormatter.parametersLabel=PARAMETERS httpAccessLogFormatter.dispatchingClassLabel=DISPATCHING CLASS httpAccessLogFormatter.endLabel=HTTP ACCESS END
セッションストアIDについて¶
セッションストアIDを出力に含めた場合、 セッションストア が発行するセッションを識別するIDが出力される。
この値は セッション変数保存ハンドラ の往路で記録されたものが使用される。 したがってセッションストアIDをログに出力する場合、 HTTPアクセスログハンドラ は セッション変数保存ハンドラ より後に配置しなければならない。
セッションストアIDはリクエスト処理開始時の状態で固定されるため、以下のような仕様になる。