
nablarch.fw.web.handler.HttpAccessJsonLogFormatter Maven / Gradle / Ivy
The newest version!
package nablarch.fw.web.handler;
import nablarch.common.web.session.InternalSessionUtil;
import nablarch.core.ThreadContext;
import nablarch.core.log.LogUtil.MapValueEditor;
import nablarch.core.log.LogUtil.MaskingMapValueEditor;
import nablarch.core.log.app.AppLogUtil;
import nablarch.core.log.app.JsonLogFormatterSupport;
import nablarch.core.log.basic.JsonLogObjectBuilder;
import nablarch.core.text.json.BasicJsonSerializationManager;
import nablarch.core.text.json.JsonSerializationManager;
import nablarch.core.text.json.JsonSerializationSettings;
import nablarch.core.util.StringUtil;
import nablarch.core.util.annotation.Published;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
/**
* HTTPアクセスログのメッセージをフォーマットするクラス。
* @author Shuji Kitamura
*/
@Published(tag = "architect")
public class HttpAccessJsonLogFormatter extends HttpAccessLogFormatter {
/** ラベルの項目名 */
private static final String TARGET_NAME_LABEL = "label";
/** リクエストIDの項目名 */
private static final String TARGET_NAME_REQUEST_ID = "requestId";
/** ユーザIDの項目名 */
private static final String TARGET_NAME_USER_ID = "userId";
/** URLの項目名 */
private static final String TARGET_NAME_URL = "url";
/** クエリ文字列の項目名 */
private static final String TARGET_NAME_QUERY = "queryString";
/** ポート番号の項目名 */
private static final String TARGET_NAME_PORT = "port";
/** HTTPメソッドの項目名 */
private static final String TARGET_NAME_METHOD = "method";
/** リクエストパラメータの項目名 */
private static final String TARGET_NAME_PARAMETERS = "parameters";
/** セッションスコープ情報の項目名 */
private static final String TARGET_NAME_SESSION_SCOPE = "sessionScope";
/** ディスパッチ先クラスの項目名 */
private static final String TARGET_NAME_DISPATCHING_CLASS = "dispatchingClass";
/** セッションIDの項目名 */
private static final String TARGET_NAME_SESSION_ID = "sessionId";
/** セッションストアIDの項目名 */
private static final String TARGET_NAME_SESSION_STORE_ID = "sessionStoreId";
/** ステータスコードの項目名 */
private static final String TARGET_NAME_STATUS_CODE = "statusCode";
/** クライアントへのレスポンスに使用するステータスコードの項目名 */
private static final String TARGET_NAME_RESPONSE_STATUS_CODE = "responseStatusCode";
/** コンテンツパスの項目名 */
private static final String TARGET_NAME_CONTENT_PATH = "contentPath";
/** クライアント端末IPアドレスの項目名 */
private static final String TARGET_NAME_CLIENT_IP_ADDRESS = "clientIpAddress";
/** クライアント端末ホストの項目名 */
private static final String TARGET_NAME_CLIENT_HOST = "clientHost";
/** HTTPヘッダのUser-Agentの項目名 */
private static final String TARGET_NAME_CLIENT_USER_AGENT = "clientUserAgent";
/** 開始日時の項目名 */
private static final String TARGET_NAME_START_TIME = "startTime";
/** 終了日時の項目名 */
private static final String TARGET_NAME_END_TIME = "endTime";
/** 実行時間の項目名 */
private static final String TARGET_NAME_EXECUTION_TIME = "executionTime";
/** 最大メモリ量の項目名 */
private static final String TARGET_NAME_MAX_MEMORY = "maxMemory";
/** 空きメモリ量(開始時)の項目名 */
private static final String TARGET_NAME_FREE_MEMORY = "freeMemory";
/** リクエスト処理開始時の出力項目を取得する際に使用するプロパティ名 */
private static final String PROPS_BEGIN_TARGETS = PROPS_PREFIX + "beginTargets";
/** hiddenパラメータ復号後の出力項目を取得する際に使用するプロパティ名 */
private static final String PROPS_PARAMETERS_TARGETS = PROPS_PREFIX + "parametersTargets";
/** ディスパッチ先クラス決定後の出力項目を取得する際に使用するプロパティ名 */
private static final String PROPS_DISPATCHING_CLASS_TARGETS = PROPS_PREFIX + "dispatchingClassTargets";
/** リクエスト処理終了時の出力項目を取得する際に使用するプロパティ名 */
private static final String PROPS_END_TARGETS = PROPS_PREFIX + "endTargets";
/** リクエスト処理開始時のラベルのプロパティ名 */
private static final String PROPS_BEGIN_LABEL = PROPS_PREFIX + "beginLabel";
/** hiddenパラメータ復号後のラベルのプロパティ名 */
private static final String PROPS_PARAMETERS_LABEL = PROPS_PREFIX + "parametersLabel";
/** ディスパッチ先クラス決定後のラベルのプロパティ名 */
private static final String PROPS_DISPATCHING_CLASS_LABEL = PROPS_PREFIX + "dispatchingClassLabel";
/** リクエスト処理終了時のラベルのプロパティ名 */
private static final String PROPS_END_LABEL = PROPS_PREFIX + "endLabel";
/** デフォルトのリクエスト処理開始時の出力項目 */
private static final String DEFAULT_BEGIN_TARGETS = "label,requestId,userId,sessionId,url,"
+ "method,port,clientIpAddress,clientHost";
/** デフォルトのhiddenパラメータ復号後の出力項目 */
private static final String DEFAULT_PARAMETERS_TARGETS = "label,parameters";
/** デフォルトのディスパッチ先クラス決定後の出力項目 */
private static final String DEFAULT_DISPATCHING_CLASS_TARGETS = "label,dispatchingClass";
/** デフォルトのリクエスト処理終了時の出力項目 */
private static final String DEFAULT_END_TARGETS = "label,requestId,userId,sessionId,url,"
+ "statusCode,contentPath,startTime,endTime,executionTime,maxMemory,freeMemory";
/** デフォルトのリクエスト処理開始時のラベル */
private static final String DEFAULT_BEGIN_LABEL = "HTTP ACCESS BEGIN";
/** デフォルトのhiddenパラメータ復号後のラベル */
private static final String DEFAULT_PARAMETERS_LABEL = "PARAMETERS";
/** デフォルトのディスパッチ先クラス決定後のラベル */
private static final String DEFAULT_DISPATCHING_CLASS_LABEL = "DISPATCHING CLASS";
/** デフォルトのリクエスト処理終了時のラベル */
private static final String DEFAULT_END_LABEL = "HTTP ACCESS END";
/** リクエスト処理開始時のフォーマット済みのログ出力項目 */
private List> beginStructuredTargets;
/** hiddenパラメータ復号後のフォーマット済みのログ出力項目 */
private List> parametersStructuredTargets;
/** ディスパッチ先クラス決定後のフォーマット済みのログ出力項目 */
private List> dispatchingClassStructuredTargets;
/** リクエスト処理終了時のフォーマット済みのログ出力項目 */
private List> endStructuredTargets;
/** 出力対象にメモリ項目が含まれているか否か。 */
private boolean containsMemoryItem;
/** 各種ログのJSONフォーマット支援オブジェクト */
private JsonLogFormatterSupport support;
/**
* 初期化。
* フォーマット済みのログ出力項目を初期化する。
* @param props 各種ログ出力の設定情報
*/
@Override
protected void initialize(Map props) {
initializeEnabled(props);
JsonSerializationSettings settings = new JsonSerializationSettings(props, PROPS_PREFIX, AppLogUtil.getFilePath());
JsonSerializationManager serializationManager = createSerializationManager(settings);
support = new JsonLogFormatterSupport(serializationManager, settings);
Map> objectBuilders = getObjectBuilders(props);
if (isBeginOutputEnabled()) {
String label = getProp(props, PROPS_BEGIN_LABEL, DEFAULT_BEGIN_LABEL);
objectBuilders.put(TARGET_NAME_LABEL, new LabelBuilder(label));
beginStructuredTargets = getStructuredTargets(objectBuilders, props, PROPS_BEGIN_TARGETS, DEFAULT_BEGIN_TARGETS);
}
if (isParametersOutputEnabled()) {
String label = getProp(props, PROPS_PARAMETERS_LABEL, DEFAULT_PARAMETERS_LABEL);
objectBuilders.put(TARGET_NAME_LABEL, new LabelBuilder(label));
parametersStructuredTargets = getStructuredTargets(objectBuilders, props, PROPS_PARAMETERS_TARGETS, DEFAULT_PARAMETERS_TARGETS);
}
if (isDispatchingClassOutputEnabled()) {
String label = getProp(props, PROPS_DISPATCHING_CLASS_LABEL, DEFAULT_DISPATCHING_CLASS_LABEL);
objectBuilders.put(TARGET_NAME_LABEL, new LabelBuilder(label));
dispatchingClassStructuredTargets = getStructuredTargets(objectBuilders, props, PROPS_DISPATCHING_CLASS_TARGETS, DEFAULT_DISPATCHING_CLASS_TARGETS);
}
if (isEndOutputEnabled()) {
String label = getProp(props, PROPS_END_LABEL, DEFAULT_END_LABEL);
objectBuilders.put(TARGET_NAME_LABEL, new LabelBuilder(label));
endStructuredTargets = getStructuredTargets(objectBuilders, props, PROPS_END_TARGETS, DEFAULT_END_TARGETS);
initContainsMemoryItem();
}
}
/**
* 変換処理に使用する{@link JsonSerializationManager}を生成する。
* @param settings 各種ログ出力の設定情報
* @return {@link JsonSerializationManager}
*/
protected JsonSerializationManager createSerializationManager(JsonSerializationSettings settings) {
return new BasicJsonSerializationManager();
}
/**
* {@link #containsMemoryItem}の値を初期化する。
*
* {@link #endStructuredTargets}に{@link MaxMemoryBuilder}か{@link FreeMemoryBuilder}の
* いずれかが設定されている場合は true を設定する。
*
*/
private void initContainsMemoryItem() {
for (JsonLogObjectBuilder target : endStructuredTargets) {
if (target instanceof MaxMemoryBuilder || target instanceof FreeMemoryBuilder) {
containsMemoryItem = true;
return;
}
}
}
/**
* フォーマット対象のログ出力項目を取得する。
* @param props 各種ログ出力の設定情報
* @return フォーマット対象のログ出力項目
*/
protected Map> getObjectBuilders(Map props) {
Map> objectBuilders
= new HashMap>();
char maskingChar = getMaskingChar(props);
Pattern[] maskingPatterns = getMaskingPatterns(props);
MapValueEditor mapValueEditor = new MaskingMapValueEditor(maskingChar, maskingPatterns);
objectBuilders.put(TARGET_NAME_REQUEST_ID, new RequestIdBuilder());
objectBuilders.put(TARGET_NAME_USER_ID, new UserIdBuilder());
objectBuilders.put(TARGET_NAME_URL, new UrlBuilder());
objectBuilders.put(TARGET_NAME_QUERY, new QueryStringBuilder());
objectBuilders.put(TARGET_NAME_PORT, new PortBuilder());
objectBuilders.put(TARGET_NAME_METHOD, new MethodBuilder());
objectBuilders.put(TARGET_NAME_PARAMETERS, new ParametersBuilder(mapValueEditor));
objectBuilders.put(TARGET_NAME_SESSION_SCOPE, new SessionScopeBuilder(mapValueEditor));
objectBuilders.put(TARGET_NAME_DISPATCHING_CLASS, new DispatchingClassBuilder());
objectBuilders.put(TARGET_NAME_SESSION_ID, new SessionIdBuilder());
objectBuilders.put(TARGET_NAME_SESSION_STORE_ID, new SessionStoreIdBuilder());
objectBuilders.put(TARGET_NAME_STATUS_CODE, new StatusCodeBuilder());
objectBuilders.put(TARGET_NAME_RESPONSE_STATUS_CODE, new ResponseStatusCodeBuilder());
objectBuilders.put(TARGET_NAME_CONTENT_PATH, new ContentPathBuilder());
objectBuilders.put(TARGET_NAME_CLIENT_IP_ADDRESS, new ClientIpAddressBuilder());
objectBuilders.put(TARGET_NAME_CLIENT_HOST, new ClientHostBuilder());
objectBuilders.put(TARGET_NAME_CLIENT_USER_AGENT, new ClientUserAgentBuilder());
objectBuilders.put(TARGET_NAME_START_TIME, new StartTimeBuilder());
objectBuilders.put(TARGET_NAME_END_TIME, new EndTimeBuilder());
objectBuilders.put(TARGET_NAME_EXECUTION_TIME, new ExecutionTimeBuilder());
objectBuilders.put(TARGET_NAME_MAX_MEMORY, new MaxMemoryBuilder());
objectBuilders.put(TARGET_NAME_FREE_MEMORY, new FreeMemoryBuilder());
return objectBuilders;
}
/**
* フォーマット済みのログ出力項目を取得する。
* @param objectBuilders オブジェクトビルダー
* @param props 各種ログ出力の設定情報
* @param targetsPropName 出力項目のプロパティ名
* @param defaultTargets デフォルトの出力項目
* @return フォーマット済みのログ出力項目
*/
private List> getStructuredTargets(
Map> objectBuilders,
Map props,
String targetsPropName, String defaultTargets) {
String targetsStr = props.get(targetsPropName);
if (StringUtil.isNullOrEmpty(targetsStr)) targetsStr = defaultTargets;
List> structuredTargets
= new ArrayList>();
String[] targets = targetsStr.split(",");
Set keys = new HashSet(targets.length);
for (String target: targets) {
String key = target.trim();
if (!StringUtil.isNullOrEmpty(key) && !keys.contains(key)) {
keys.add(key);
if (objectBuilders.containsKey(key)) {
structuredTargets.add(objectBuilders.get(key));
} else {
throw new IllegalArgumentException(
String.format("[%s] is unknown target. property name = [%s]", key, targetsPropName));
}
}
}
return structuredTargets;
}
/**
* 出力対象にメモリ項目が含まれているか否かを判定する。
* @return 出力対象にメモリ項目が含まれている場合はtrue
*/
@Override
public boolean containsMemoryItem() {
return containsMemoryItem;
}
/**
* リクエスト処理開始時のメッセージをフォーマットする。
* @param context HttpAccessLogContext
* @return フォーマット済みのメッセージ
*/
@Override
public String formatBegin(HttpAccessLogContext context) {
return support.getStructuredMessage(beginStructuredTargets, context);
}
/**
* hiddenパラメータ復号後のメッセージをフォーマットする。
* @param context HttpAccessLogContext
* @return フォーマット済みのメッセージ
*/
@Override
public String formatParameters(HttpAccessLogContext context) {
return support.getStructuredMessage(parametersStructuredTargets, context);
}
/**
* ディスパッチ先クラス決定後のメッセージをフォーマットする。
* @param context HttpAccessLogContext
* @return フォーマット済みのメッセージ
*/
@Override
public String formatDispatchingClass(HttpAccessLogContext context) {
return support.getStructuredMessage(dispatchingClassStructuredTargets, context);
}
/**
* リクエスト処理終了時のメッセージをフォーマットする。
* @param context HttpAccessLogContext
* @return フォーマット済みのメッセージ
*/
@Override
public String formatEnd(HttpAccessLogContext context) {
return support.getStructuredMessage(endStructuredTargets, context);
}
/**
* ラベルを処理するクラス。
* @author Shuji Kitamura
*/
public static class LabelBuilder implements JsonLogObjectBuilder {
private final String label;
/**
* コンストラクタ。
* @param label ラベル
*/
public LabelBuilder(String label) {
this.label = label;
}
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_LABEL, label);
}
}
/**
* リクエストIDを処理するクラス。
* @author Shuji Kitamura
*/
public static class RequestIdBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_REQUEST_ID, ThreadContext.getRequestId());
}
}
/**
* ユーザIDを処理するクラス。
* @author Shuji Kitamura
*/
public static class UserIdBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_USER_ID, ThreadContext.getUserId());
}
}
/**
* URLを処理するクラス。
* @author Shuji Kitamura
*/
public static class UrlBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_URL, context.getUrl());
}
}
/**
* クエリ文字列を処理するクラス。
* @author Shuji Kitamura
*/
public static class QueryStringBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_QUERY, context.getQueryString());
}
}
/**
* ポート番号を処理するクラス。
* @author Shuji Kitamura
*/
public static class PortBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_PORT, context.getPort());
}
}
/**
* HTTPメソッドを処理するクラス。
* @author Shuji Kitamura
*/
public static class MethodBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_METHOD, context.getMethod());
}
}
/**
* リクエストパラメータを処理するクラス。
* @author Shuji Kitamura
*/
public static class ParametersBuilder implements JsonLogObjectBuilder {
/** マップの値のマスキング */
private final MapValueEditor mapValueEditor;
/**
* コンストラクタ。
* @param mapValueEditor マップの値のマスキング
*/
public ParametersBuilder(MapValueEditor mapValueEditor) {
this.mapValueEditor = mapValueEditor;
}
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
Map map = new HashMap();
for (Map.Entry entry : context.getParameters().entrySet()) {
String [] values = new String[entry.getValue().length];
for (int i = 0; i < entry.getValue().length; i++) {
values[i] = mapValueEditor.edit(entry.getKey(), entry.getValue()[i]);
}
map.put(entry.getKey(), values);
}
structuredObject.put(TARGET_NAME_PARAMETERS, map);
}
}
/**
* セッションスコープ情報を処理するクラス。
* @author Shuji Kitamura
*/
public static class SessionScopeBuilder implements JsonLogObjectBuilder {
/** マップの値のマスキング */
private final MapValueEditor mapValueEditor;
/**
* コンストラクタ。
* @param mapValueEditor マップの値のマスキング
*/
public SessionScopeBuilder(MapValueEditor mapValueEditor) {
this.mapValueEditor = mapValueEditor;
}
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
Map map = new HashMap();
for (Map.Entry entry : context.getSessionScopeMap().entrySet()) {
String values = mapValueEditor.edit(entry.getKey(), entry.getValue());
map.put(entry.getKey(), values);
}
structuredObject.put(TARGET_NAME_SESSION_SCOPE, map);
}
}
/**
* ディスパッチ先クラスを処理するクラス。
* @author Shuji Kitamura
*/
public static class DispatchingClassBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_DISPATCHING_CLASS, context.getDispatchingClass());
}
}
/**
* セッションIDを処理するクラス。
* @author Shuji Kitamura
*/
public static class SessionIdBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_SESSION_ID, context.getSessionId());
}
}
/**
* セッションストアIDを処理するクラス。
* @author Tanaka Tomoyuki
*/
public static class SessionStoreIdBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_SESSION_STORE_ID, InternalSessionUtil.getId(context.getContext()));
}
}
/**
* ステータスコードを処理するクラス。
* @author Shuji Kitamura
*/
public static class StatusCodeBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
int statusCode = context.getStatusCode();
structuredObject.put(TARGET_NAME_STATUS_CODE, statusCode != -1 ? statusCode : null);
}
}
/**
* クライアントへのレスポンスに使用するステータスコードを処理するクラス。
* @author Shuji Kitamura
*/
public static class ResponseStatusCodeBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
int statusCode = HttpResponseUtil.chooseResponseStatusCode(context.getResponse(), context.getContext());
structuredObject.put(TARGET_NAME_RESPONSE_STATUS_CODE, statusCode != -1 ? statusCode : null);
}
}
/**
* コンテンツパスを処理するクラス。
* @author Shuji Kitamura
*/
public static class ContentPathBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_CONTENT_PATH, context.getContentPath());
}
}
/**
* クライアント端末IPアドレスを処理するクラス。
* @author Shuji Kitamura
*/
public static class ClientIpAddressBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_CLIENT_IP_ADDRESS, context.getClientIpAddress());
}
}
/**
* クライアント端末ホストを処理するクラス。
* @author Shuji Kitamura
*/
public static class ClientHostBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_CLIENT_HOST, context.getClientHost());
}
}
/**
* HTTPヘッダのUser-Agentを処理するクラス。
* @author Shuji Kitamura
*/
public static class ClientUserAgentBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_CLIENT_USER_AGENT, context.getServletRequest().getHeader("User-Agent"));
}
}
/**
* 開始日時を処理するクラス。
* @author Shuji Kitamura
*/
public static class StartTimeBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_START_TIME, new Date(context.getStartTime()));
}
}
/**
* 終了日時を処理するクラス。
* @author Shuji Kitamura
*/
public static class EndTimeBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_END_TIME, new Date(context.getEndTime()));
}
}
/**
* 実行時間を処理するクラス。
* @author Shuji Kitamura
*/
public static class ExecutionTimeBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_EXECUTION_TIME, context.getExecutionTime());
}
}
/**
* 最大メモリ量を処理するクラス。
* @author Shuji Kitamura
*/
public static class MaxMemoryBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_MAX_MEMORY, context.getMaxMemory());
}
}
/** 空きメモリ量(開始時)を処理するクラス。
* @author Shuji Kitamura
*/
public static class FreeMemoryBuilder implements JsonLogObjectBuilder {
/**
* {@inheritDoc}
*/
@Override
public void build(Map structuredObject, HttpAccessLogContext context) {
structuredObject.put(TARGET_NAME_FREE_MEMORY, context.getFreeMemory());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy