From b40a52e5b2c8aaae975bed054408c39f4e3fd0db Mon Sep 17 00:00:00 2001 From: Steve Smokowski Date: Thu, 9 Feb 2017 15:59:56 -0500 Subject: Initial OpenEcomp A&AI Logging Service commit Change-Id: Ie67c5746c2aeafc0fa4318b5ba7ef8af1b3a2eda Signed-off-by: Steve Smokowski --- logging-api/pom.xml | 41 ++++ .../main/java/org/openecomp/cl/api/LogFields.java | 84 ++++++++ .../main/java/org/openecomp/cl/api/LogLine.java | 115 +++++++++++ .../src/main/java/org/openecomp/cl/api/Logger.java | 216 +++++++++++++++++++++ .../openecomp/cl/api/LoggerFactoryInterface.java | 43 ++++ .../main/java/org/openecomp/cl/mdc/MdcContext.java | 78 ++++++++ .../java/org/openecomp/cl/mdc/MdcOverride.java | 44 +++++ 7 files changed, 621 insertions(+) create mode 100644 logging-api/pom.xml create mode 100644 logging-api/src/main/java/org/openecomp/cl/api/LogFields.java create mode 100644 logging-api/src/main/java/org/openecomp/cl/api/LogLine.java create mode 100644 logging-api/src/main/java/org/openecomp/cl/api/Logger.java create mode 100644 logging-api/src/main/java/org/openecomp/cl/api/LoggerFactoryInterface.java create mode 100644 logging-api/src/main/java/org/openecomp/cl/mdc/MdcContext.java create mode 100644 logging-api/src/main/java/org/openecomp/cl/mdc/MdcOverride.java (limited to 'logging-api') diff --git a/logging-api/pom.xml b/logging-api/pom.xml new file mode 100644 index 0000000..4c4470e --- /dev/null +++ b/logging-api/pom.xml @@ -0,0 +1,41 @@ + + + + 4.0.0 + + + org.openecomp.aai.logging-service + logging-service + 1.0.0-SNAPSHOT + + + org.openecomp.aai + logging-api + Common Logging API + + + + org.slf4j + slf4j-api + 1.7.5 + + + diff --git a/logging-api/src/main/java/org/openecomp/cl/api/LogFields.java b/logging-api/src/main/java/org/openecomp/cl/api/LogFields.java new file mode 100644 index 0000000..87b3f3f --- /dev/null +++ b/logging-api/src/main/java/org/openecomp/cl/api/LogFields.java @@ -0,0 +1,84 @@ +/*- + * ============LICENSE_START======================================================= + * Common Logging Library + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.cl.api; + +import java.util.HashMap; +import java.util.Map; + +public class LogFields { + + /** Map of field names to values. */ + private Map fields = new HashMap(); + + /** + * Retrieve the contents of the specified field entry. + * + * @param field + * - The field to retrieve the value for. + * + * @return - The value associated with the specified field, or null if there + * is no such entry. + */ + public String getField(Enum field) { + return fields.get(field.ordinal()); + } + + /** + * Assigns a value to a specific field. + * + * @param field + * - The field to assign a value to. + * @param value + * - The value to assign to the field. + * + * @return - The {@link LogFields} object (this is useful for parameter + * chaining. + */ + public LogFields setField(Enum field, String value) { + fields.put(field.ordinal(), value); + return this; + } + + /** + * Assigns a value to a specific field. + * + * @param field - The field to assign a value to. + * @param value - The value to assign to the field. + * + * @return - The {@link LogFields} object (this is useful for parameter + * chaining. + */ + public LogFields setField(Enum field, int value) { + fields.put(field.ordinal(), String.valueOf(value)); + return this; + } + + /** + * Determines whether or not a value has been assigned to a particular field. + * + * @param field - The field to be checked. + * + * @return - true if an entry exists for the specified field, false otherwise. + */ + public boolean fieldIsSet(Enum field) { + return fields.containsKey(field.ordinal()) && (fields.get(field.ordinal()) != null); + } +} diff --git a/logging-api/src/main/java/org/openecomp/cl/api/LogLine.java b/logging-api/src/main/java/org/openecomp/cl/api/LogLine.java new file mode 100644 index 0000000..2b6f30f --- /dev/null +++ b/logging-api/src/main/java/org/openecomp/cl/api/LogLine.java @@ -0,0 +1,115 @@ +/*- + * ============LICENSE_START======================================================= + * Common Logging Library + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.cl.api; + +import org.openecomp.cl.mdc.MdcContext; +import org.openecomp.cl.mdc.MdcOverride; + +import org.slf4j.MDC; + +/** + * This class is used to help standardize how log lines are written and provide + * profiling info. + */ +public abstract class LogLine { + + public static enum LogLineType { + AUDIT, ERROR, METRICS + } + + /** + * Enumerates the predefined fields of the log line. Note that this + * enumeration only exposes those fields that the client may set via the + * {@link LogFields} object. Fields which are automatically populated by the + * logging service or sourced from the {@link MdcContext} do not appear here. + */ + public enum DefinedFields { + + STATUS_CODE, + RESPONSE_CODE, + RESPONSE_DESCRIPTION, + INSTANCE_UUID, + SEVERITY, + SERVER_IP, + CLIENT_IP, + CLASS_NAME, + PROCESS_KEY, + TARGET_SVC_NAME, + TARGET_ENTITY, + ERROR_CODE, + ERROR_DESCRIPTION, + CUSTOM_1, + CUSTOM_2, + CUSTOM_3, + CUSTOM_4; + } + + protected String component = ""; + protected String logCode = ""; + protected String level = ""; + protected String message = ""; + protected MdcOverride override = new MdcOverride(); + protected LogFields fields = new LogFields(); + + /** + * Sets common values that the log line will use for populating the log + * string. + * + * @param component + * - The entity invoking the log. + * @param logCode + * - String version of the log message code. + * @param level + * - Log level (DEBUG, TRACE, INFO, WARN, ERROR...) + * @param msg + * - The log message + * @param fields + * - A map of predefined log line fields to values. + * @param override + * - Structure which overrides selective fields in the + * {@link MdcContext} + */ + public void init(String component, String logCode, String level, String msg, LogFields fields, + MdcOverride override) { + + this.component = component; + this.logCode = logCode; + this.level = level; + this.message = msg; + this.override = override; + this.fields = fields; + } + + protected String getMdcValue(String attribute) { + if (override.hasOverride(attribute)) { + return override.getAttributeValue(attribute); + } + + String value = (String) MDC.get(attribute) == null ? "" : (String) MDC.get(attribute); + return value; + } + + public abstract String getFormattedLine(); + + protected String fieldValue(Enum field) { + return (fields.fieldIsSet(field) ? fields.getField(field) : ""); + } +} diff --git a/logging-api/src/main/java/org/openecomp/cl/api/Logger.java b/logging-api/src/main/java/org/openecomp/cl/api/Logger.java new file mode 100644 index 0000000..2b428e5 --- /dev/null +++ b/logging-api/src/main/java/org/openecomp/cl/api/Logger.java @@ -0,0 +1,216 @@ +/*- + * ============LICENSE_START======================================================= + * Common Logging Library + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.cl.api; + +import org.openecomp.cl.mdc.MdcOverride; + +/** Defines the common API which all Logger implementations must expose. */ +public interface Logger { + + /** + * Indicate whether or not TRACE level logging is enabled. + * + * @return true if TRACE level logs are enabled, false otherwise + */ + public boolean isTraceEnabled(); + + /** + * Indicate whether or not INFO level logging is enabled. + * + * @return true if INFO level logs are enabled, false otherwise + */ + public boolean isInfoEnabled(); + + /** + * Indicate whether or not ERROR level logging is enabled. + * + * @return true if ERROR level logs are enabled, false otherwise + */ + public boolean isErrorEnabled(); + + /** + * Indicate whether or not WARNING level logging is enabled. + * + * @return true if WARNING level logs are enabled, false otherwise + */ + public boolean isWarnEnabled(); + + /** + * Indicate whether or not DEBUG level logging is enabled. + * + * @return true if DEBUG level logs are enabled, false otherwise + */ + public boolean isDebugEnabled(); + + /** + * Log an INFO message based on a message key defined in a resource bundle + * with arguments. + * + * @param logCode + * - Log message identifier. + * @param arguments + * - Arguments to populate the log message template with. + */ + public void info(Enum logCode, String... arguments); + + /** + * Log an INFO message based on a message key defined in a resource bundle + * with arguments. + * + * @param logCode + * - Log message identifier. + * @param fields + * - Map containing values for any log fields which the client wants + * to populate. + * @param arguments + * - Arguments to populate the log message template with. + */ + public void info(Enum logCode, LogFields fields, String... arguments); + + /** + * Log an INFO message based on a message key defined in a resource bundle + * with arguments. + * + * @param logCode - Log message identifier. + * @param fields - Map containing values for any log fields which the + * client wants to populate. + * @param override - A set of values to override values stored in the MDC context + * @param arguments - Arguments to populate the log message template with. + */ + public void info(Enum logCode, LogFields fields, MdcOverride override, String... arguments); + + /** + * Log a WARNING message based on a message key defined in a resource bundle + * with arguments. + * + * @param logCode - Log message identifier. + * @param arguments - Arguments to populate the log message template with. + */ + public void warn(Enum logCode, String... arguments); + + /** + * Log a WARNING message based on a message key defined in a resource bundle + * with arguments. + * + * @param logCode - Log message identifier. + * @param fields - Map containing values for any log fields which the + * client wants to populate. + * @param arguments - Arguments to populate the log message template with. + */ + public void warn(Enum logCode, LogFields fields, String... arguments); + + /** + * Log a TRACE message based on a message key defined in a resource bundle + * with arguments. + * + * @param logCode - Log message identifier. + * @param arguments - Arguments to populate the log message template with. + */ + public void trace(Enum logCode, String... arguments); + + /** + * Log a TRACE message based on a message key defined in a resource bundle + * with arguments. + * + * @param logCode - Log message identifier. + * @param fields - Map containing values for any log fields which the + * client wants to populate. + * @param arguments - Arguments to populate the log message template with. + */ + public void trace(Enum logCode, LogFields fields, String... arguments); + + /** + * Log a simple, non-templated DEBUG message. + * + * @param logMessage - The message to be logged. + */ + public void debug(String logMessage); + + /** + * Log a DEBUG message based on a message key defined in a resource bundle + * with arguments. + * + * @param logCode - Log message identifier. + * @param arguments - Arguments to populate the log message template with. + */ + public void debug(Enum logCode, String... arguments); + + /** + * Log a DEBUG message based on a message key defined in a resource bundle + * with arguments. + * + * @param logCode - Log message identifier. + * @param fields - Map containing values for any log fields which the + * client wants to populate. + * @param arguments - Arguments to populate the log message template with. + */ + public void debug(Enum logCode, LogFields fields, String... arguments); + + /** + * Log an ERROR message based on a message key defined in a resource bundle + * with arguments. + * + * @param logCode - Log message identifier. + * @param arguments - Arguments to populate the log message template with. + */ + public void error(Enum logCode, String... arguments); + + /** + * Log an ERROR message based on a message key defined in a resource bundle + * with arguments. + * + * @param logCode - Log message identifier. + * @param fields - Map containing values for any log fields which the + * client wants to populate. + * @param arguments - Arguments to populate the log message template with. + */ + public void error(Enum logCode, LogFields fields, String... arguments); + + /** + * Log an ERROR message based on a message key defined in a resource bundle + * with arguments and a throwable exception. + * + * @param logCode - Log message identifier. + * @param ex - The exception to be logged. + * @param arguments - Arguments to populate the log message template with. + */ + public void error(Enum logCode, Throwable ex, String... arguments); + + /** + * Log an ERROR message based on a message key defined in a resource bundle + * with arguments and a throwable exception. + * + * @param logCode - Log message identifier. + * @param fields - Map containing values for any log fields which the + * client wants to populate. + * @param ex - The exception to be logged. + * @param arguments - Arguments to populate the log message template with. + */ + public void error(Enum logCode, LogFields fields, Throwable ex, String... arguments); + + /** + * Format the given log using the supplied arguments + * @param logCode - Log message identifier. + * @param arguments - Arguments to populate the log message template with. + */ + public String formatMsg(Enum logCode, String... arguments); + +} diff --git a/logging-api/src/main/java/org/openecomp/cl/api/LoggerFactoryInterface.java b/logging-api/src/main/java/org/openecomp/cl/api/LoggerFactoryInterface.java new file mode 100644 index 0000000..c990881 --- /dev/null +++ b/logging-api/src/main/java/org/openecomp/cl/api/LoggerFactoryInterface.java @@ -0,0 +1,43 @@ +/*- + * ============LICENSE_START======================================================= + * Common Logging Library + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.cl.api; + +/** + * Defines the common API that must be exposed by all LoggerFactory + * implementations. + */ +public interface LoggerFactoryInterface { + + /** + * Returns the logger associated with the name. + * + * @return Logger + */ + public Logger getLogger(String name); + + /** + * Returns the logger associated with the clazz. + * + * @return Logger + */ + public Logger getLogger(Class clazz); + +} diff --git a/logging-api/src/main/java/org/openecomp/cl/mdc/MdcContext.java b/logging-api/src/main/java/org/openecomp/cl/mdc/MdcContext.java new file mode 100644 index 0000000..6e9e6f4 --- /dev/null +++ b/logging-api/src/main/java/org/openecomp/cl/mdc/MdcContext.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * Common Logging Library + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.cl.mdc; + +import org.slf4j.MDC; + +import java.net.InetAddress; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * This class manages the MDC (mapped diagnostic context). Calling the init + * method when a new event is processed will save thread-specific context + * information which will be used when generating logs. + */ +public final class MdcContext { + public static String MDC_REQUEST_ID = "RequestId"; + public static String MDC_SERVER_FQDN = "ServerFQDN"; + public static String MDC_SERVICE_NAME = "ServiceName"; + public static String MDC_PARTNER_NAME = "PartnerName"; + public static String MDC_START_TIME = "StartTime"; + public static String MDC_REMOTE_HOST = "RemoteHost"; + public static String MDC_SERVICE_INSTANCE_ID = "ServiceInstanceId"; + public static String MDC_CLIENT_ADDRESS = "ClientAddress"; + + /** + * Initializes the fields of the Mapped Diagnostic Context. + * + * @param transId - Unique transaction identifier. + * @param serviceName - The name of the service generating the diagnostic. + * @param serviceInstance - Unique identifier of the specific instance + * generating the diagnostic. + * @param partnerName - Name of the entity initiating the transction to + * be logged + * @param clientAddress - IP address of the transaction client. + */ + public static void initialize(String transId, + String serviceName, + String serviceInstance, + String partnerName, + String clientAddress) { + MDC.clear(); + MDC.put(MDC_REQUEST_ID, transId); + MDC.put(MDC_SERVICE_NAME, serviceName); + MDC.put(MDC_SERVICE_INSTANCE_ID, serviceInstance); + MDC.put(MDC_PARTNER_NAME, partnerName); + MDC.put(MDC_CLIENT_ADDRESS, clientAddress); + MDC.put(MDC_START_TIME, + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").format(new Date())); + + try { + MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getCanonicalHostName()); + } catch (Exception e) { + // If, for some reason we are unable to get the canonical host name, we + // just want to leave the field unpopulated. There is not much value + // in doing anything else with an exception at this point. + } + + } +} diff --git a/logging-api/src/main/java/org/openecomp/cl/mdc/MdcOverride.java b/logging-api/src/main/java/org/openecomp/cl/mdc/MdcOverride.java new file mode 100644 index 0000000..413ce36 --- /dev/null +++ b/logging-api/src/main/java/org/openecomp/cl/mdc/MdcOverride.java @@ -0,0 +1,44 @@ +/*- + * ============LICENSE_START======================================================= + * Common Logging Library + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.cl.mdc; + +import java.util.HashMap; +import java.util.Map; + +/** + * This class stores a map of MDC context attribute/values which can be used to + * override the actual MDC context. + */ +public class MdcOverride { + private Map overrides = new HashMap(); + + public void addAttribute(String attr, String val) { + overrides.put(attr, val); + } + + public String getAttributeValue(String attr) { + return overrides.get(attr); + } + + public boolean hasOverride(String attr) { + return overrides.containsKey(attr); + } +} -- cgit 1.2.3-korg