From 59ca3931c12409629f08a1dbb25226986e7a341c Mon Sep 17 00:00:00 2001 From: Azeem Muzammil Date: Tue, 21 May 2024 10:30:17 +0530 Subject: [PATCH] Refactor access logging process --- .../http/api/logging/HttpLogManager.java | 29 +-- .../accesslog/HttpAccessLogConfig.java | 56 +++++ .../accesslog/HttpAccessLogFormat.java | 2 +- .../accesslog/HttpAccessLogMessage.java | 183 +++++++++++++++ .../logging/accesslog/HttpAccessLogger.java} | 222 ++---------------- .../formatters/HttpAccessLogFormatter.java | 7 - .../api/logging/logger/HttpAccessLogger.java | 36 --- .../http/api/logging/logger/HttpLogger.java | 188 --------------- .../api/logging/logger/HttpLoggerFactory.java | 32 --- .../DefaultHttpClientConnector.java | 8 +- .../listener/http2/Http2SourceHandler.java | 3 +- .../states/http2/SendingEntityBody.java | 10 +- .../sender/states/ReceivingEntityBody.java | 5 +- .../states/http2/ReceivingEntityBody.java | 5 +- 14 files changed, 272 insertions(+), 514 deletions(-) create mode 100644 native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogConfig.java rename native/src/main/java/io/ballerina/stdlib/http/{transport/contractimpl/common => api/logging}/accesslog/HttpAccessLogFormat.java (90%) create mode 100644 native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogMessage.java rename native/src/main/java/io/ballerina/stdlib/http/{transport/contractimpl/common/accesslog/HttpAccessLogMessage.java => api/logging/accesslog/HttpAccessLogger.java} (52%) delete mode 100644 native/src/main/java/io/ballerina/stdlib/http/api/logging/logger/HttpAccessLogger.java delete mode 100644 native/src/main/java/io/ballerina/stdlib/http/api/logging/logger/HttpLogger.java delete mode 100644 native/src/main/java/io/ballerina/stdlib/http/api/logging/logger/HttpLoggerFactory.java diff --git a/native/src/main/java/io/ballerina/stdlib/http/api/logging/HttpLogManager.java b/native/src/main/java/io/ballerina/stdlib/http/api/logging/HttpLogManager.java index 296e12ce7..cc067ecb6 100644 --- a/native/src/main/java/io/ballerina/stdlib/http/api/logging/HttpLogManager.java +++ b/native/src/main/java/io/ballerina/stdlib/http/api/logging/HttpLogManager.java @@ -20,15 +20,10 @@ import io.ballerina.runtime.api.values.BMap; import io.ballerina.runtime.api.values.BString; +import io.ballerina.stdlib.http.api.logging.accesslog.HttpAccessLogConfig; import io.ballerina.stdlib.http.api.logging.formatters.HttpAccessLogFormatter; import io.ballerina.stdlib.http.api.logging.formatters.HttpTraceLogFormatter; import io.ballerina.stdlib.http.api.logging.formatters.JsonLogFormatter; -import io.ballerina.stdlib.http.api.logging.logger.HttpAccessLogger; -import io.ballerina.stdlib.http.api.logging.logger.HttpLoggerFactory; -import io.ballerina.stdlib.http.transport.contractimpl.common.accesslog.HttpAccessLogFormat; -import io.ballerina.stdlib.http.transport.contractimpl.common.accesslog.HttpAccessLogMessage; -import io.netty.util.internal.logging.InternalLogger; -import io.netty.util.internal.logging.InternalLoggerFactory; import java.io.IOException; import java.io.InputStream; @@ -44,13 +39,10 @@ import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_ACCESS_LOG_ENABLED; import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_LOG_CONSOLE; import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_LOG_FILE_PATH; -import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_LOG_FORMAT; -import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_LOG_FORMAT_JSON; import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_TRACE_LOG; import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_TRACE_LOG_ENABLED; import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_TRACE_LOG_HOST; import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_TRACE_LOG_PORT; -import static io.ballerina.stdlib.http.transport.contract.Constants.ACCESS_LOG; /** * Java util logging manager for ballerina which overrides the readConfiguration method to replace placeholders @@ -72,7 +64,6 @@ public class HttpLogManager extends LogManager { protected Logger httpTraceLogger; protected Logger httpAccessLogger; - protected InternalLogger httpInternalLogger; private String protocol; public HttpLogManager(boolean traceLogConsole, BMap traceLogAdvancedConfig, BMap accessLogConfig, @@ -80,7 +71,7 @@ public HttpLogManager(boolean traceLogConsole, BMap traceLogAdvancedConfig, BMap this.protocol = protocol.getValue(); this.setHttpTraceLogHandler(traceLogConsole, traceLogAdvancedConfig); this.setHttpAccessLogHandler(accessLogConfig); - HttpAccessLogMessage.initializeHttpAccessLogConfig(accessLogConfig); + HttpAccessLogConfig.initializeHttpAccessLogConfig(accessLogConfig); } /** @@ -145,17 +136,13 @@ public void setHttpAccessLogHandler(BMap accessLogConfig) { // keep a reference to prevent this logger from being garbage collected httpAccessLogger = Logger.getLogger(HTTP_ACCESS_LOG); } - if (httpInternalLogger == null) { - httpInternalLogger = InternalLoggerFactory.getInstance(ACCESS_LOG); - } PrintStream stdErr = System.err; boolean accessLogsEnabled = false; - HttpAccessLogFormat accessLogFormat = getAccessLogFormat(accessLogConfig); Boolean consoleLogEnabled = accessLogConfig.getBooleanValue(HTTP_LOG_CONSOLE); if (consoleLogEnabled) { ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setFormatter(new HttpAccessLogFormatter(accessLogFormat)); + consoleHandler.setFormatter(new HttpAccessLogFormatter()); consoleHandler.setLevel(Level.INFO); httpAccessLogger.addHandler(consoleHandler); httpAccessLogger.setLevel(Level.INFO); @@ -166,7 +153,7 @@ public void setHttpAccessLogHandler(BMap accessLogConfig) { if (filePath != null && !filePath.getValue().trim().isEmpty()) { try { FileHandler fileHandler = new FileHandler(filePath.getValue(), true); - fileHandler.setFormatter(new HttpAccessLogFormatter(accessLogFormat)); + fileHandler.setFormatter(new HttpAccessLogFormatter()); fileHandler.setLevel(Level.INFO); httpAccessLogger.addHandler(fileHandler); httpAccessLogger.setLevel(Level.INFO); @@ -181,12 +168,4 @@ public void setHttpAccessLogHandler(BMap accessLogConfig) { stdErr.println("ballerina: " + protocol + " access log enabled"); } } - - private HttpAccessLogFormat getAccessLogFormat(BMap accessLogConfig) { - BString logFormat = accessLogConfig.getStringValue(HTTP_LOG_FORMAT); - if (logFormat.getValue().equals(HTTP_LOG_FORMAT_JSON)) { - return HttpAccessLogFormat.JSON; - } - return HttpAccessLogFormat.FLAT; - } } diff --git a/native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogConfig.java b/native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogConfig.java new file mode 100644 index 000000000..41ba7ec13 --- /dev/null +++ b/native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogConfig.java @@ -0,0 +1,56 @@ +package io.ballerina.stdlib.http.api.logging.accesslog; + +import io.ballerina.runtime.api.values.BArray; +import io.ballerina.runtime.api.values.BMap; +import io.ballerina.runtime.api.values.BString; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_LOG_ATTRIBUTES; +import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_LOG_FORMAT; +import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_LOG_FORMAT_JSON; + +public class HttpAccessLogConfig { + private static final Set EXCLUDED_ATTRIBUTES = new HashSet<>(List.of( + "http_referrer", "http_user_agent", "http_x_forwarded_for" + )); + private static BMap accessLogConfig = null; + + public static void initializeHttpAccessLogConfig(BMap accessLogConfigFromBallerina) { + accessLogConfig = accessLogConfigFromBallerina; + } + + public static List getCustomHeaders() { + List attributes = getAccessLogAttributes(); + if (attributes == null) { + return Collections.emptyList(); + } + + return attributes.stream() + .filter(attr -> attr.startsWith("http_") && !EXCLUDED_ATTRIBUTES.contains(attr)) + .map(attr -> attr.substring(5)) + .collect(Collectors.toList()); + } + + public static HttpAccessLogFormat getAccessLogFormat() { + BString logFormat = accessLogConfig.getStringValue(HTTP_LOG_FORMAT); + if (logFormat.getValue().equals(HTTP_LOG_FORMAT_JSON)) { + return HttpAccessLogFormat.JSON; + } + return HttpAccessLogFormat.FLAT; + } + + public static List getAccessLogAttributes() { + BArray logAttributes = accessLogConfig.getArrayValue(HTTP_LOG_ATTRIBUTES); + if (logAttributes != null) { + return Arrays.stream(logAttributes.getStringArray()) + .collect(Collectors.toList()); + } + return null; + } +} diff --git a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/common/accesslog/HttpAccessLogFormat.java b/native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogFormat.java similarity index 90% rename from native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/common/accesslog/HttpAccessLogFormat.java rename to native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogFormat.java index bdb359935..4ac452c0f 100644 --- a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/common/accesslog/HttpAccessLogFormat.java +++ b/native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogFormat.java @@ -16,7 +16,7 @@ * under the License. */ -package io.ballerina.stdlib.http.transport.contractimpl.common.accesslog; +package io.ballerina.stdlib.http.api.logging.accesslog; public enum HttpAccessLogFormat { FLAT, JSON diff --git a/native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogMessage.java b/native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogMessage.java new file mode 100644 index 000000000..78947170c --- /dev/null +++ b/native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogMessage.java @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 LLC. 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 io.ballerina.stdlib.http.api.logging.accesslog; + +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +public class HttpAccessLogMessage { + private String ip; + private Calendar dateTime; + private String requestMethod; + private String requestUri; + private String scheme; + private int status; + private long requestBodySize; + private long responseBodySize; + private long requestTime; + private String httpReferrer; + private String httpUserAgent; + private String httpXForwardedFor; + private String host; + private int port; + private Map customHeaders; + + public HttpAccessLogMessage() { + this.customHeaders = new HashMap<>(); + } + + public HttpAccessLogMessage(String ip, Calendar dateTime, String requestMethod, String requestUri, String scheme, + int status, long responseBodySize, String httpReferrer, String httpUserAgent) { + this.ip = ip; + this.dateTime = dateTime; + this.requestMethod = requestMethod; + this.requestUri = requestUri; + this.scheme = scheme; + this.status = status; + this.responseBodySize = responseBodySize; + this.httpReferrer = httpReferrer; + this.httpUserAgent = httpUserAgent; + this.customHeaders = new HashMap<>(); + } + + public Calendar getDateTime() { + return dateTime; + } + + public void setDateTime(Calendar dateTime) { + this.dateTime = dateTime; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getRequestMethod() { + return requestMethod; + } + + public void setRequestMethod(String requestMethod) { + this.requestMethod = requestMethod; + } + + public String getRequestUri() { + return requestUri; + } + + public void setRequestUri(String requestUri) { + this.requestUri = requestUri; + } + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public long getRequestBodySize() { + return requestBodySize; + } + + public void setRequestBodySize(Long requestBodySize) { + this.requestBodySize = requestBodySize; + } + + public long getResponseBodySize() { + return responseBodySize; + } + + public void setResponseBodySize(Long responseBodySize) { + this.responseBodySize = responseBodySize; + } + + public long getRequestTime() { + return requestTime; + } + + public void setRequestTime(Long requestTime) { + this.requestTime = requestTime; + } + + public String getHttpUserAgent() { + return httpUserAgent; + } + + public String getHttpReferrer() { + return httpReferrer; + } + + public void setHttpReferrer(String httpReferrer) { + this.httpReferrer = httpReferrer; + } + + public void setHttpUserAgent(String httpUserAgent) { + this.httpUserAgent = httpUserAgent; + } + + public String getHttpXForwardedFor() { + return httpXForwardedFor; + } + + public void setHttpXForwardedFor(String httpXForwardedFor) { + this.httpXForwardedFor = httpXForwardedFor; + } + + public String getHost() { + return this.host; + } + + public void setHost(String host) { + this.host = host; + } + + public int getPort() { + return this.port; + } + + public void setPort(int port) { + this.port = port; + } + + public Map getCustomHeaders() { + return customHeaders; + } + + public void setCustomHeaders(Map customHeaders) { + this.customHeaders = customHeaders; + } + + public void putCustomHeader(String headerKey, String headerValue) { + this.customHeaders.put(headerKey, headerValue); + } +} diff --git a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/common/accesslog/HttpAccessLogMessage.java b/native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogger.java similarity index 52% rename from native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/common/accesslog/HttpAccessLogMessage.java rename to native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogger.java index 2201b3fd6..2f06c1ebe 100644 --- a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/common/accesslog/HttpAccessLogMessage.java +++ b/native/src/main/java/io/ballerina/stdlib/http/api/logging/accesslog/HttpAccessLogger.java @@ -16,228 +16,38 @@ * under the License. */ -package io.ballerina.stdlib.http.transport.contractimpl.common.accesslog; +package io.ballerina.stdlib.http.api.logging.accesslog; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import io.ballerina.runtime.api.values.BArray; -import io.ballerina.runtime.api.values.BMap; -import io.ballerina.runtime.api.values.BString; +import io.netty.util.internal.logging.InternalLogLevel; +import io.netty.util.internal.logging.InternalLogger; +import io.netty.util.internal.logging.InternalLoggerFactory; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; -import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_LOG_ATTRIBUTES; -import static io.ballerina.stdlib.http.api.HttpConstants.HTTP_LOG_FORMAT; +import static io.ballerina.stdlib.http.transport.contract.Constants.ACCESS_LOG; -public class HttpAccessLogMessage { - private static final Set EXCLUDED_ATTRIBUTES = new HashSet<>(List.of( - "http_referrer", "http_user_agent", "http_x_forwarded_for" - )); - private static BMap accessLogConfig = null; - private String ip; - private Calendar dateTime; - private String requestMethod; - private String requestUri; - private String scheme; - private int status; - private long requestBodySize; - private long responseBodySize; - private long requestTime; - private String httpReferrer; - private String httpUserAgent; - private String httpXForwardedFor; - private String host; - private int port; - private Map customHeader; +public class HttpAccessLogger { + private static final InternalLogger ACCESS_LOGGER = InternalLoggerFactory.getInstance(ACCESS_LOG); - public HttpAccessLogMessage() { - this.customHeader = new HashMap<>(); + public static boolean isEnabled() { + return ACCESS_LOGGER.isEnabled(InternalLogLevel.INFO); } - public HttpAccessLogMessage(String ip, Calendar dateTime, String requestMethod, String requestUri, String scheme, - int status, long responseBodySize, String httpReferrer, String httpUserAgent) { - this.ip = ip; - this.dateTime = dateTime; - this.requestMethod = requestMethod; - this.requestUri = requestUri; - this.scheme = scheme; - this.status = status; - this.responseBodySize = responseBodySize; - this.httpReferrer = httpReferrer; - this.httpUserAgent = httpUserAgent; - this.customHeader = new HashMap<>(); + public static void log(HttpAccessLogMessage inboundMessage, List outboundMessages) { + String formattedAccessLogMessage = formatAccessLogMessage(inboundMessage, outboundMessages, + HttpAccessLogConfig.getAccessLogFormat(), HttpAccessLogConfig.getAccessLogAttributes()); + ACCESS_LOGGER.log(InternalLogLevel.INFO, formattedAccessLogMessage); } - public Calendar getDateTime() { - return dateTime; - } - - public void setDateTime(Calendar dateTime) { - this.dateTime = dateTime; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public String getRequestMethod() { - return requestMethod; - } - - public void setRequestMethod(String requestMethod) { - this.requestMethod = requestMethod; - } - - public String getRequestUri() { - return requestUri; - } - - public void setRequestUri(String requestUri) { - this.requestUri = requestUri; - } - - public String getScheme() { - return scheme; - } - - public void setScheme(String scheme) { - this.scheme = scheme; - } - - public int getStatus() { - return status; - } - - public void setStatus(int status) { - this.status = status; - } - - public long getRequestBodySize() { - return requestBodySize; - } - - public void setRequestBodySize(Long requestBodySize) { - this.requestBodySize = requestBodySize; - } - - public long getResponseBodySize() { - return responseBodySize; - } - - public void setResponseBodySize(Long responseBodySize) { - this.responseBodySize = responseBodySize; - } - - public long getRequestTime() { - return requestTime; - } - - public void setRequestTime(Long requestTime) { - this.requestTime = requestTime; - } - - public String getHttpUserAgent() { - return httpUserAgent; - } - - public String getHttpReferrer() { - return httpReferrer; - } - - public void setHttpReferrer(String httpReferrer) { - this.httpReferrer = httpReferrer; - } - - public void setHttpUserAgent(String httpUserAgent) { - this.httpUserAgent = httpUserAgent; - } - - public String getHttpXForwardedFor() { - return httpXForwardedFor; - } - - public void setHttpXForwardedFor(String httpXForwardedFor) { - this.httpXForwardedFor = httpXForwardedFor; - } - - public String getHost() { - return this.host; - } - - public void setHost(String host) { - this.host = host; - } - - public int getPort() { - return this.port; - } - - public void setPort(int port) { - this.port = port; - } - - public Map getCustomHeader() { - return customHeader; - } - - public void setCustomHeaderValues(Map customHeader) { - this.customHeader = customHeader; - } - - public void putCustomHeader(String headerKey, String headerValue) { - this.customHeader.put(headerKey, headerValue); - } - - public static void initializeHttpAccessLogConfig(BMap accessLogConfigFromBallerina) { - accessLogConfig = accessLogConfigFromBallerina; - } - - public static List getCustomHeaders() { - List attributes = getAccessLogAttributes(); - if (attributes == null) { - return Collections.emptyList(); - } - - return attributes.stream() - .filter(attr -> attr.startsWith("http_") && !EXCLUDED_ATTRIBUTES.contains(attr)) - .map(attr -> attr.substring(5)) - .collect(Collectors.toList()); - } - - public static HttpAccessLogFormat getAccessLogFormat() { - BString logFormat = accessLogConfig.getStringValue(HTTP_LOG_FORMAT); - if (logFormat.getValue().equals("json")) { - return HttpAccessLogFormat.JSON; - } - return HttpAccessLogFormat.FLAT; - } - - public static List getAccessLogAttributes() { - BArray logAttributes = accessLogConfig.getArrayValue(HTTP_LOG_ATTRIBUTES); - if (logAttributes != null) { - return Arrays.stream(logAttributes.getStringArray()) - .collect(Collectors.toList()); - } - return null; - } - - public static String formatAccessLogMessage(HttpAccessLogMessage inboundMessage, + private static String formatAccessLogMessage(HttpAccessLogMessage inboundMessage, List outboundMessages, HttpAccessLogFormat format, List attributes) { if (format == HttpAccessLogFormat.FLAT) { @@ -279,7 +89,7 @@ public static String formatAccessLogMessage(HttpAccessLogMessage inboundMessage, } private static Map mapAccessLogMessage(HttpAccessLogMessage httpAccessLogMessage, - HttpAccessLogFormat format, List attributes) { + HttpAccessLogFormat format, List attributes) { List allAttributes = List.of("ip", "date_time", "request", "request_method", "request_uri", "scheme", "status", "request_body_size", "response_body_size", "request_time", "http_referrer", "http_user_agent", "http_x_forwarded_for"); @@ -326,7 +136,7 @@ private static String formatAccessLogAttribute(HttpAccessLogMessage httpAccessLo private static String getCustomHeaderValueForAttribute(HttpAccessLogMessage httpAccessLogMessage, String attribute) { - Map customHeaders = httpAccessLogMessage.getCustomHeader(); + Map customHeaders = httpAccessLogMessage.getCustomHeaders(); if (attribute.startsWith("http_")) { String customHeaderKey = attribute.substring(5).toLowerCase(Locale.getDefault()); return customHeaders.getOrDefault(customHeaderKey, "-"); diff --git a/native/src/main/java/io/ballerina/stdlib/http/api/logging/formatters/HttpAccessLogFormatter.java b/native/src/main/java/io/ballerina/stdlib/http/api/logging/formatters/HttpAccessLogFormatter.java index 302a5adb6..3330eaf7a 100644 --- a/native/src/main/java/io/ballerina/stdlib/http/api/logging/formatters/HttpAccessLogFormatter.java +++ b/native/src/main/java/io/ballerina/stdlib/http/api/logging/formatters/HttpAccessLogFormatter.java @@ -19,7 +19,6 @@ package io.ballerina.stdlib.http.api.logging.formatters; import io.ballerina.stdlib.http.api.logging.HttpLogManager; -import io.ballerina.stdlib.http.transport.contractimpl.common.accesslog.HttpAccessLogFormat; import java.util.logging.Formatter; import java.util.logging.LogRecord; @@ -30,12 +29,6 @@ * @since 0.965 */ public class HttpAccessLogFormatter extends Formatter { - private HttpAccessLogFormat accessLogFormat; - - public HttpAccessLogFormatter(HttpAccessLogFormat accessLogFormat) { - this.accessLogFormat = accessLogFormat; - } - private static final String format = HttpLogManager.getLogManager().getProperty( HttpAccessLogFormatter.class.getCanonicalName() + ".format"); diff --git a/native/src/main/java/io/ballerina/stdlib/http/api/logging/logger/HttpAccessLogger.java b/native/src/main/java/io/ballerina/stdlib/http/api/logging/logger/HttpAccessLogger.java deleted file mode 100644 index dc6a72524..000000000 --- a/native/src/main/java/io/ballerina/stdlib/http/api/logging/logger/HttpAccessLogger.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 LLC. 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 io.ballerina.stdlib.http.api.logging.logger; - -import io.ballerina.stdlib.http.transport.contractimpl.common.accesslog.HttpAccessLogFormat; - -public class HttpAccessLogger extends HttpLogger { - HttpAccessLogFormat format = HttpAccessLogFormat.FLAT; - public HttpAccessLogger(String name) { - super(name); - } - - public HttpAccessLogFormat getFormat() { - return format; - } - - public void setFormat(HttpAccessLogFormat format) { - this.format = format; - } -} diff --git a/native/src/main/java/io/ballerina/stdlib/http/api/logging/logger/HttpLogger.java b/native/src/main/java/io/ballerina/stdlib/http/api/logging/logger/HttpLogger.java deleted file mode 100644 index 205c7108f..000000000 --- a/native/src/main/java/io/ballerina/stdlib/http/api/logging/logger/HttpLogger.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 LLC. 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 io.ballerina.stdlib.http.api.logging.logger; - -import io.netty.util.internal.logging.AbstractInternalLogger; -import io.netty.util.internal.logging.InternalLogLevel; - -public class HttpLogger extends AbstractInternalLogger { - - protected HttpLogger(String name) { - super(name); - } - - @Override - public boolean isTraceEnabled() { - return false; - } - - @Override - public void trace(String s) { - - } - - @Override - public void trace(String s, Object o) { - - } - - @Override - public void trace(String s, Object o, Object o1) { - - } - - @Override - public void trace(String s, Object... objects) { - - } - - @Override - public void trace(String s, Throwable throwable) { - - } - - @Override - public boolean isDebugEnabled() { - - return false; - } - - @Override - public void debug(String s) { - - } - - @Override - public void debug(String s, Object o) { - - } - - @Override - public void debug(String s, Object o, Object o1) { - - } - - @Override - public void debug(String s, Object... objects) { - - } - - @Override - public void debug(String s, Throwable throwable) { - - } - - @Override - public boolean isInfoEnabled() { - - return false; - } - - @Override - public void info(String s) { - - } - - @Override - public void info(String s, Object o) { - - } - - @Override - public void info(String s, Object o, Object o1) { - - } - - @Override - public void info(String s, Object... objects) { - - } - - @Override - public void info(String s, Throwable throwable) { - - } - - @Override - public boolean isWarnEnabled() { - - return false; - } - - @Override - public void warn(String s) { - - } - - @Override - public void warn(String s, Object o) { - - } - - @Override - public void warn(String s, Object... objects) { - - } - - @Override - public void warn(String s, Object o, Object o1) { - - } - - @Override - public void warn(String s, Throwable throwable) { - - } - - @Override - public boolean isErrorEnabled() { - - return false; - } - - @Override - public void error(String s) { - - } - - @Override - public void error(String s, Object o) { - - } - - @Override - public void error(String s, Object o, Object o1) { - - } - - @Override - public void error(String s, Object... objects) { - - } - - @Override - public void error(String s, Throwable throwable) { - - } - - @Override - public void log(InternalLogLevel level, String msg) { - super.log(level, msg); - } -} \ No newline at end of file diff --git a/native/src/main/java/io/ballerina/stdlib/http/api/logging/logger/HttpLoggerFactory.java b/native/src/main/java/io/ballerina/stdlib/http/api/logging/logger/HttpLoggerFactory.java deleted file mode 100644 index 6c2ae7ccf..000000000 --- a/native/src/main/java/io/ballerina/stdlib/http/api/logging/logger/HttpLoggerFactory.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 LLC. 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 io.ballerina.stdlib.http.api.logging.logger; - -import io.netty.util.internal.logging.InternalLogger; -import io.netty.util.internal.logging.InternalLoggerFactory; - -public class HttpLoggerFactory extends InternalLoggerFactory { - @Override - protected InternalLogger newInstance(String name) { - if (name.contains("accesslog")) { - return new HttpAccessLogger(name); - } - return this.newInstance(name); - } -} diff --git a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/DefaultHttpClientConnector.java b/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/DefaultHttpClientConnector.java index ca42c76ac..d570ef461 100644 --- a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/DefaultHttpClientConnector.java +++ b/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/DefaultHttpClientConnector.java @@ -19,6 +19,7 @@ package io.ballerina.stdlib.http.transport.contractimpl; +import io.ballerina.stdlib.http.api.logging.accesslog.HttpAccessLogMessage; import io.ballerina.stdlib.http.transport.contract.Constants; import io.ballerina.stdlib.http.transport.contract.HttpClientConnector; import io.ballerina.stdlib.http.transport.contract.HttpResponseFuture; @@ -28,7 +29,6 @@ import io.ballerina.stdlib.http.transport.contract.exceptions.ClientConnectorException; import io.ballerina.stdlib.http.transport.contractimpl.common.HttpRoute; import io.ballerina.stdlib.http.transport.contractimpl.common.Util; -import io.ballerina.stdlib.http.transport.contractimpl.common.accesslog.HttpAccessLogMessage; import io.ballerina.stdlib.http.transport.contractimpl.common.ssl.SSLConfig; import io.ballerina.stdlib.http.transport.contractimpl.common.states.SenderReqRespStateManager; import io.ballerina.stdlib.http.transport.contractimpl.listener.SourceHandler; @@ -51,9 +51,6 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.EventLoopGroup; -import io.netty.handler.codec.http.HttpHeaderNames; -import io.netty.handler.codec.http.HttpHeaders; -import io.netty.handler.codec.http.HttpMessage; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http2.Http2CodecUtil; import org.slf4j.Logger; @@ -61,14 +58,11 @@ import java.io.IOException; import java.net.InetSocketAddress; -import java.net.SocketAddress; import java.util.Calendar; import java.util.NoSuchElementException; -import static io.ballerina.stdlib.http.transport.contract.Constants.HTTP_X_FORWARDED_FOR; import static io.ballerina.stdlib.http.transport.contract.Constants.OUTBOUND_ACCESS_LOG_MESSAGE; import static io.ballerina.stdlib.http.transport.contract.Constants.REMOTE_SERVER_CLOSED_BEFORE_INITIATING_OUTBOUND_REQUEST; -import static io.ballerina.stdlib.http.transport.contract.Constants.TO; /** * Implementation of the client connector. diff --git a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/listener/http2/Http2SourceHandler.java b/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/listener/http2/Http2SourceHandler.java index 3284bdb6b..4ea94255d 100644 --- a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/listener/http2/Http2SourceHandler.java +++ b/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/listener/http2/Http2SourceHandler.java @@ -18,10 +18,10 @@ package io.ballerina.stdlib.http.transport.contractimpl.listener.http2; +import io.ballerina.stdlib.http.api.logging.accesslog.HttpAccessLogMessage; import io.ballerina.stdlib.http.transport.contract.Constants; import io.ballerina.stdlib.http.transport.contract.ServerConnectorFuture; import io.ballerina.stdlib.http.transport.contract.exceptions.ServerConnectorException; -import io.ballerina.stdlib.http.transport.contractimpl.common.accesslog.HttpAccessLogMessage; import io.ballerina.stdlib.http.transport.contractimpl.common.states.Http2MessageStateContext; import io.ballerina.stdlib.http.transport.contractimpl.listener.HttpServerChannelInitializer; import io.ballerina.stdlib.http.transport.contractimpl.listener.states.http2.EntityBodyReceived; @@ -52,7 +52,6 @@ import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/listener/states/http2/SendingEntityBody.java b/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/listener/states/http2/SendingEntityBody.java index 1d14df795..d058be3f5 100644 --- a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/listener/states/http2/SendingEntityBody.java +++ b/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/listener/states/http2/SendingEntityBody.java @@ -18,12 +18,13 @@ package io.ballerina.stdlib.http.transport.contractimpl.listener.states.http2; +import io.ballerina.stdlib.http.api.logging.accesslog.HttpAccessLogMessage; +import io.ballerina.stdlib.http.api.logging.accesslog.HttpAccessLogger; import io.ballerina.stdlib.http.transport.contract.HttpResponseFuture; import io.ballerina.stdlib.http.transport.contract.ServerConnectorFuture; import io.ballerina.stdlib.http.transport.contract.exceptions.ServerConnectorException; import io.ballerina.stdlib.http.transport.contractimpl.Http2OutboundRespListener; import io.ballerina.stdlib.http.transport.contractimpl.common.Util; -import io.ballerina.stdlib.http.transport.contractimpl.common.accesslog.HttpAccessLogMessage; import io.ballerina.stdlib.http.transport.contractimpl.common.states.Http2MessageStateContext; import io.ballerina.stdlib.http.transport.contractimpl.common.states.Http2StateUtil; import io.ballerina.stdlib.http.transport.contractimpl.listener.HttpServerChannelInitializer; @@ -75,7 +76,6 @@ public class SendingEntityBody implements ListenerState { private static final Logger LOG = LoggerFactory.getLogger(SendingEntityBody.class); - private static final InternalLogger ACCESS_LOGGER = InternalLoggerFactory.getInstance(ACCESS_LOG); private final Http2MessageStateContext http2MessageStateContext; private final ChannelHandlerContext ctx; @@ -218,7 +218,7 @@ private void writeData(HttpContent httpContent, int streamId, boolean endStream) private void logAccessInfo(HttpCarbonMessage inboundRequestMsg, HttpCarbonMessage outboundResponseMsg, int streamId) { - if (!ACCESS_LOGGER.isEnabled(InternalLogLevel.INFO)) { + if (!HttpAccessLogger.isEnabled()) { return; } if (originalStreamId != streamId) { // Skip access logs for server push messages @@ -267,8 +267,6 @@ private void logAccessInfo(HttpCarbonMessage inboundRequestMsg, HttpCarbonMessag if (sourceHandlerObject instanceof Http2SourceHandler http2SourceHandler) { outboundMessages.addAll(http2SourceHandler.getHttpAccessLogMessages()); } - String formattedAccessLogMessage = HttpAccessLogMessage.formatAccessLogMessage(inboundMessage, outboundMessages, - HttpAccessLogMessage.getAccessLogFormat(), HttpAccessLogMessage.getAccessLogAttributes()); - ACCESS_LOGGER.log(InternalLogLevel.INFO, formattedAccessLogMessage); + HttpAccessLogger.log(inboundMessage, outboundMessages); } } diff --git a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/sender/states/ReceivingEntityBody.java b/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/sender/states/ReceivingEntityBody.java index 1c48d00a3..a94c72382 100644 --- a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/sender/states/ReceivingEntityBody.java +++ b/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/sender/states/ReceivingEntityBody.java @@ -18,9 +18,10 @@ package io.ballerina.stdlib.http.transport.contractimpl.sender.states; +import io.ballerina.stdlib.http.api.logging.accesslog.HttpAccessLogConfig; +import io.ballerina.stdlib.http.api.logging.accesslog.HttpAccessLogMessage; import io.ballerina.stdlib.http.transport.contract.Constants; import io.ballerina.stdlib.http.transport.contract.HttpResponseFuture; -import io.ballerina.stdlib.http.transport.contractimpl.common.accesslog.HttpAccessLogMessage; import io.ballerina.stdlib.http.transport.contractimpl.common.states.SenderReqRespStateManager; import io.ballerina.stdlib.http.transport.contractimpl.common.states.StateUtil; import io.ballerina.stdlib.http.transport.contractimpl.listener.http2.Http2SourceHandler; @@ -162,7 +163,7 @@ private void updateAccessLogInfo(TargetHandler targetHandler, if (headers.contains(HttpHeaderNames.REFERER)) { outboundAccessLogMessage.setHttpReferrer(headers.get(HttpHeaderNames.REFERER)); } - HttpAccessLogMessage.getCustomHeaders().forEach(customHeader -> + HttpAccessLogConfig.getCustomHeaders().forEach(customHeader -> outboundAccessLogMessage.putCustomHeader(customHeader, headers.contains(customHeader) ? headers.get(customHeader) : "-")); diff --git a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/sender/states/http2/ReceivingEntityBody.java b/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/sender/states/http2/ReceivingEntityBody.java index f0535fb27..e7e3063e4 100644 --- a/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/sender/states/http2/ReceivingEntityBody.java +++ b/native/src/main/java/io/ballerina/stdlib/http/transport/contractimpl/sender/states/http2/ReceivingEntityBody.java @@ -18,8 +18,9 @@ package io.ballerina.stdlib.http.transport.contractimpl.sender.states.http2; +import io.ballerina.stdlib.http.api.logging.accesslog.HttpAccessLogConfig; +import io.ballerina.stdlib.http.api.logging.accesslog.HttpAccessLogMessage; import io.ballerina.stdlib.http.transport.contract.Constants; -import io.ballerina.stdlib.http.transport.contractimpl.common.accesslog.HttpAccessLogMessage; import io.ballerina.stdlib.http.transport.contractimpl.common.states.Http2MessageStateContext; import io.ballerina.stdlib.http.transport.contractimpl.listener.http2.Http2SourceHandler; import io.ballerina.stdlib.http.transport.contractimpl.sender.http2.Http2ClientChannel; @@ -225,7 +226,7 @@ private void updateAccessLogInfo(OutboundMsgHolder outboundMsgHolder) { if (headers.contains(HttpHeaderNames.REFERER)) { outboundAccessLogMessage.setHttpReferrer(headers.get(HttpHeaderNames.REFERER)); } - HttpAccessLogMessage.getCustomHeaders().forEach(customHeader -> + HttpAccessLogConfig.getCustomHeaders().forEach(customHeader -> outboundAccessLogMessage.putCustomHeader(customHeader, headers.contains(customHeader) ? headers.get(customHeader) : "-"));