| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache license, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the license for the specific language governing permissions and |
| * limitations under the license. |
| */ |
| package org.apache.logging.log4j.audit.service; |
| |
| import java.util.UUID; |
| import java.util.function.Supplier; |
| |
| import org.apache.logging.log4j.ThreadContext; |
| import org.apache.logging.log4j.audit.annotation.Chained; |
| import org.apache.logging.log4j.audit.annotation.ClientServer; |
| import org.apache.logging.log4j.audit.annotation.HeaderPrefix; |
| import org.apache.logging.log4j.audit.annotation.Local; |
| import org.apache.logging.log4j.core.util.NetUtils; |
| import org.apache.logging.log4j.core.util.UuidUtil; |
| |
| /** |
| * Defines all the variables that an application needs to be available in the ThreadContext for audit logging and |
| * general application usage. |
| */ |
| @HeaderPrefix("mycorp-context-") |
| public final class RequestContext { |
| @ClientServer |
| public static final String REQUEST_ID = "requestId"; |
| private String requestId; |
| @ClientServer |
| public static final String SESSION_ID = "sessionId"; |
| private String sessionId; |
| @ClientServer |
| public static final String ACCOUNT_NUMBER = "accountNumber"; |
| private Long accountNumber; |
| @ClientServer |
| public static final String IP_ADDRESS = "ipAddress"; |
| private String ipAddress; |
| @ClientServer |
| public static final String USER_ID = "userId"; |
| private String userId; |
| @ClientServer |
| public static final String LOGIN_ID = "loginId"; |
| private String loginId; |
| @Local |
| public static final String CALLING_HOST = "callingHost"; |
| private String callingHost; |
| |
| public static final String HOST_NAME = "hostName"; |
| private String hostName; |
| |
| private static final String LOCAL_HOST_NAME = NetUtils.getLocalHostname(); |
| /** |
| * The Supplier is used to populate the hostName key after the hostName value from the caller has been |
| * placed into the callingHost map entry. |
| */ |
| @Chained(fieldName = HOST_NAME, chainedFieldName = CALLING_HOST) |
| public static final Supplier<String> LOCAL_HOST_SUPPLIER = () -> LOCAL_HOST_NAME; |
| /** |
| * The methods in this class are not required by framework components that use the RequestContext properties. |
| * They are provided as a convenience for applications. If they are not provided the properties can be accessed |
| * directly through the Log4j ThreadContext Map using the keys above. |
| */ |
| public static void clear() { |
| ThreadContext.clearMap(); |
| } |
| |
| public static String getRequestId() { |
| String uuidStr = ThreadContext.get(REQUEST_ID); |
| UUID uuid; |
| if (uuidStr == null) { |
| uuid = UuidUtil.getTimeBasedUuid(); |
| ThreadContext.put(REQUEST_ID, uuid.toString()); |
| } |
| return uuidStr; |
| } |
| |
| public static String getSessionId() { |
| return ThreadContext.get(SESSION_ID); |
| } |
| |
| public static void setSessionId(UUID sessionId) { |
| if (sessionId != null) { |
| ThreadContext.put(SESSION_ID, sessionId.toString()); |
| } |
| } |
| |
| public static void setSessionId(String sessionId) { |
| if (sessionId != null) { |
| ThreadContext.put(SESSION_ID, sessionId); |
| } |
| } |
| |
| public static void setAccountNumber(Long accountNumber) { |
| ThreadContext.put(ACCOUNT_NUMBER, accountNumber.toString()); |
| } |
| |
| public static Long getAccountNumber() { |
| String value = ThreadContext.get(ACCOUNT_NUMBER); |
| if (value == null || value.length() == 0) { |
| return 0L; |
| } |
| try { |
| return Long.parseLong(value); |
| } catch (Exception e) { |
| return 0L; |
| } |
| } |
| |
| public static void setIpAddress(String address) { |
| ThreadContext.put(IP_ADDRESS, address); |
| } |
| |
| public static String getIpAddress() { |
| return ThreadContext.get(IP_ADDRESS); |
| } |
| |
| public static void setUserId(String userId) { |
| ThreadContext.put(USER_ID, userId); |
| } |
| |
| public static String getUserId() { |
| return ThreadContext.get(USER_ID); |
| } |
| |
| public static void setLoginId(String loginId) { |
| ThreadContext.put(LOGIN_ID, loginId); |
| } |
| |
| public static String getLoginId() { |
| return ThreadContext.get(LOGIN_ID); |
| } |
| |
| public static String getHostName() { |
| return ThreadContext.get(HOST_NAME); |
| } |
| |
| public static void setHostName(String hostName) { |
| ThreadContext.put(HOST_NAME, hostName); |
| } |
| |
| public static String getCallingHost() { |
| return ThreadContext.get(CALLING_HOST); |
| } |
| |
| public static void setCallingHost(String hostName) { |
| ThreadContext.put(CALLING_HOST, hostName); |
| } |
| |
| /** |
| * Save the RequestContext data. |
| * @return A copy of the RequestContext data. |
| */ |
| public static RequestContext save() { |
| RequestContext context = new RequestContext(); |
| context.accountNumber = getAccountNumber(); |
| context.callingHost = getCallingHost(); |
| context.hostName = getHostName(); |
| context.ipAddress = getIpAddress(); |
| context.loginId = getLoginId(); |
| context.requestId = getRequestId(); |
| context.sessionId = getSessionId(); |
| context.userId = getUserId(); |
| return context; |
| } |
| |
| /** |
| * Populate the ThreadContext from a RequestContext object. |
| */ |
| public void restore() { |
| setAccountNumber(this.accountNumber); |
| setCallingHost(this.callingHost); |
| setHostName(this.hostName); |
| setIpAddress(this.ipAddress); |
| setLoginId(this.loginId); |
| ThreadContext.put(REQUEST_ID, this.requestId); |
| setSessionId(this.sessionId); |
| setUserId(this.userId); |
| } |
| } |