From 31a44808039c3d1349047028000b9f76ca2f161a Mon Sep 17 00:00:00 2001 From: zimsuchitgupta Date: Wed, 16 Mar 2022 12:50:03 +0530 Subject: [PATCH] ZCS-11112: updated jar version for slf4j and apache-mina Made code changes so that logs could be written in logfiles as well as handles zmprov cases --- .../com/zimbra/common/util/LogFactory.java | 5 +- .../com/zimbra/common/util/ZimbraLog.java | 112 +++++++++++++----- store/ivy.xml | 6 +- .../cs/service/admin/AddAccountLogger.java | 5 +- .../cs/service/admin/RemoveAccountLogger.java | 5 +- .../socket/nio/ZimbraSocketAcceptor.java | 6 + 6 files changed, 98 insertions(+), 41 deletions(-) diff --git a/common/src/java/com/zimbra/common/util/LogFactory.java b/common/src/java/com/zimbra/common/util/LogFactory.java index e18a9b30acc..7069522e566 100644 --- a/common/src/java/com/zimbra/common/util/LogFactory.java +++ b/common/src/java/com/zimbra/common/util/LogFactory.java @@ -16,16 +16,13 @@ */ package com.zimbra.common.util; -import java.io.FileInputStream; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import java.io.IOException; import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.config.ConfigurationSource; import org.apache.logging.log4j.core.config.Configurator; import com.zimbra.common.localconfig.LC; @@ -57,7 +54,7 @@ public synchronized static void reset() { for (Log log : getAllLoggers()) { log.removeAccountLoggers(); } - LogManager.shutdown(); + LogManager.shutdown(true); try { Configurator.initialize(null, LC.zimbra_log4j_properties.value()); } catch (Exception e) { diff --git a/common/src/java/com/zimbra/common/util/ZimbraLog.java b/common/src/java/com/zimbra/common/util/ZimbraLog.java index 931b346df22..d56441c56c7 100644 --- a/common/src/java/com/zimbra/common/util/ZimbraLog.java +++ b/common/src/java/com/zimbra/common/util/ZimbraLog.java @@ -24,12 +24,20 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; -import java.util.Properties; import java.util.Set; import java.util.TreeMap; +import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.appender.ConsoleAppender; +import org.apache.logging.log4j.core.config.Configurator; +import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder; +import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder; +import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder; +import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory; +import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder; +import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration; import com.zimbra.common.localconfig.LC; @@ -489,6 +497,25 @@ public final class ZimbraLog { */ public static final Map CATEGORY_DESCRIPTIONS; + public static final String LOG_CONFIG_NAME = "RollingBuilder"; + public static final String DEFAULT_APPENDER_NAME = "Stdout"; + public static final String DEFAULT_APPENDER_TYPE = "CONSOLE"; + public static final String DEFAULT_APPENDER_TARGET = "target"; + public static final String APPENDER_NAME = "rolling"; + public static final String APPENDER_TYPE = "RollingFile"; + public static final String LAYOUT_TYPE = "PatternLayout"; + public static final String LAYOUT_PATTERN = "pattern"; + public static final String LAYOUT_PATTERN_VALUE_WITH_THREADS = "%d [%t] %-5level: %msg%n%throwable"; + public static final String LAYOUT_PATTERN_VALUE = "%d [%t] %-5level: %msg%n"; + public static final String POLICY_TYPE = "Policies"; + public static final String POLICY_TIME_TYPE = "TimeBasedTriggeringPolicy"; + public static final String POLICY_TIME_TYPE_INTERVAL = "interval"; + public static final String POLICY_TIME_TYPE_INTERVAL_VALUE = "1"; + public static final String APPENDER_FILE_NAME = "fileName"; + public static final String APPENDER_FILE_PATTERN = "filePattern"; + public static final String LOGGER_NAME = "TestLogger"; + public static final String LOGGER_ADDITIVITY = "additivity"; + private ZimbraLog() { } @@ -854,25 +881,38 @@ public static void toolSetupLog4j(String defaultLevel, String logFile, boolean s if (level == null) { level = defaultLevel; } - Properties p = new Properties(); - p.put("log4j.rootLogger", level + ",A1"); - if (logFile != null) { - p.put("log4j.appender.A1", "org.apache.log4j.FileAppender"); - p.put("log4j.appender.A1.File", logFile); - p.put("log4j.appender.A1.Append", "false"); - } else { - p.put("log4j.appender.A1", "org.apache.log4j.ConsoleAppender"); - } - p.put("log4j.appender.A1.layout", "org.apache.log4j.PatternLayout"); + ConfigurationBuilder< BuiltConfiguration > builder = ConfigurationBuilderFactory.newConfigurationBuilder(); + builder.setStatusLevel(Level.INFO); + builder.setConfigurationName(LOG_CONFIG_NAME); + // create a console appender + AppenderComponentBuilder appenderBuilder = builder.newAppender(DEFAULT_APPENDER_NAME, DEFAULT_APPENDER_TYPE) + .addAttribute(DEFAULT_APPENDER_TARGET, ConsoleAppender.Target.SYSTEM_OUT); + LayoutComponentBuilder layoutBuilder = builder.newLayout(LAYOUT_TYPE); if (showThreads) { - p.put("log4j.appender.A1.layout.ConversionPattern", "[%t] [%x] %p: %m%n"); + layoutBuilder.addAttribute(LAYOUT_PATTERN, LAYOUT_PATTERN_VALUE_WITH_THREADS); } else { - p.put("log4j.appender.A1.layout.ConversionPattern", "[%x] %p: %m%n"); + layoutBuilder.addAttribute(LAYOUT_PATTERN, LAYOUT_PATTERN_VALUE); } - LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false); - File file = new File(p.getClass().toString()); - // this will force a reconfiguration - context.setConfigLocation(file.toURI()); + builder.add(appenderBuilder.add(layoutBuilder)); + + // create a rolling file appender + ComponentBuilder policy = builder.newComponent(POLICY_TYPE) + .addComponent(builder.newComponent(POLICY_TIME_TYPE).addAttribute(POLICY_TIME_TYPE_INTERVAL, POLICY_TIME_TYPE_INTERVAL_VALUE)); + appenderBuilder = builder.newAppender(APPENDER_NAME, APPENDER_TYPE) + .addAttribute(APPENDER_FILE_NAME, logFile) + .addAttribute(APPENDER_FILE_PATTERN, logFile.substring(0, logFile.lastIndexOf(".log")) + "-%d{yyyy-MM-dd}") + .add(layoutBuilder) + .addComponent(policy); + builder.add(appenderBuilder); + + // create the new logger + builder.add(builder.newLogger(LOGGER_NAME, level) + .add(builder.newAppenderRef(APPENDER_NAME)) + .addAttribute(LOGGER_ADDITIVITY, false)); + + builder.add(builder.newRootLogger(level) + .add(builder.newAppenderRef(APPENDER_NAME))); + Configurator.initialize(builder.build()); } public static void toolSetupLog4jConsole(String defaultLevel, boolean stderr, boolean showThreads) { @@ -880,24 +920,32 @@ public static void toolSetupLog4jConsole(String defaultLevel, boolean stderr, bo if (level == null) { level = defaultLevel; } - Properties p = new Properties(); - p.put("log4j.rootLogger", level + ",A1"); - - p.put("log4j.appender.A1", "org.apache.log4j.ConsoleAppender"); - if (stderr) - p.put("log4j.appender.A1.target", "System.err"); - - p.put("log4j.appender.A1.layout", "org.apache.log4j.PatternLayout"); + ConfigurationBuilder< BuiltConfiguration > builder = ConfigurationBuilderFactory.newConfigurationBuilder(); + builder.setStatusLevel(Level.INFO); + builder.setConfigurationName(LOG_CONFIG_NAME); + + // create a console appender + AppenderComponentBuilder appenderBuilder = builder.newAppender(DEFAULT_APPENDER_NAME, DEFAULT_APPENDER_TYPE); + if (stderr) { + appenderBuilder.addAttribute(DEFAULT_APPENDER_TARGET, ConsoleAppender.Target.SYSTEM_ERR); + } else { + appenderBuilder.addAttribute(DEFAULT_APPENDER_TARGET, ConsoleAppender.Target.SYSTEM_OUT); + } + LayoutComponentBuilder layoutBuilder = builder.newLayout(LAYOUT_TYPE); if (showThreads) { - p.put("log4j.appender.A1.layout.ConversionPattern", "[%t] [%x] %p: %m%n"); + layoutBuilder.addAttribute(LAYOUT_PATTERN, LAYOUT_PATTERN_VALUE_WITH_THREADS); } else { - p.put("log4j.appender.A1.layout.ConversionPattern", "[%x] %p: %m%n"); + layoutBuilder.addAttribute(LAYOUT_PATTERN, LAYOUT_PATTERN_VALUE); } - LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false); - File file = new File(p.getClass().toString()); - // this will force a reconfiguration - context.setConfigLocation(file.toURI()); - } + builder.add(appenderBuilder.add(layoutBuilder)); + // create the new logger + builder.add(builder.newLogger(LOGGER_NAME, level) + .add(builder.newAppenderRef(DEFAULT_APPENDER_NAME)) + .addAttribute(LOGGER_ADDITIVITY, false)); + + builder.add(builder.newRootLogger(level) + .add(builder.newAppenderRef(DEFAULT_APPENDER_NAME))); + Configurator.reconfigure(builder.build()); } /** * Setup log4j for command line tool using specified log4j.properties file. If file doesn't exist diff --git a/store/ivy.xml b/store/ivy.xml index 89234f5f36c..9292dd7136b 100644 --- a/store/ivy.xml +++ b/store/ivy.xml @@ -15,8 +15,8 @@ - - + + @@ -71,7 +71,7 @@ - + diff --git a/store/src/java/com/zimbra/cs/service/admin/AddAccountLogger.java b/store/src/java/com/zimbra/cs/service/admin/AddAccountLogger.java index 0cf1da20e67..71171f7ac5a 100644 --- a/store/src/java/com/zimbra/cs/service/admin/AddAccountLogger.java +++ b/store/src/java/com/zimbra/cs/service/admin/AddAccountLogger.java @@ -23,6 +23,9 @@ import java.util.List; import java.util.Map; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; + import com.zimbra.common.account.Key.AccountBy; import com.zimbra.common.localconfig.LC; import com.zimbra.common.service.ServiceException; @@ -83,7 +86,7 @@ public Element handle(Element request, Map context) throw ServiceException.INVALID_REQUEST(error, null); } - if (!category.equalsIgnoreCase(CATEGORY_ALL) && !LogFactory.logExists(category)) { + if (!category.equalsIgnoreCase(CATEGORY_ALL) && !((LoggerContext) LogManager.getContext(false)).hasLogger(category)) { throw ServiceException.INVALID_REQUEST("Log category " + category + " does not exist.", null); } diff --git a/store/src/java/com/zimbra/cs/service/admin/RemoveAccountLogger.java b/store/src/java/com/zimbra/cs/service/admin/RemoveAccountLogger.java index 6574ec73d9c..f880f280ecc 100644 --- a/store/src/java/com/zimbra/cs/service/admin/RemoveAccountLogger.java +++ b/store/src/java/com/zimbra/cs/service/admin/RemoveAccountLogger.java @@ -19,6 +19,9 @@ import java.util.List; import java.util.Map; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; + import com.zimbra.common.service.ServiceException; import com.zimbra.common.soap.AdminConstants; import com.zimbra.common.soap.Element; @@ -63,7 +66,7 @@ public Element handle(Element request, Map context) category = eLogger.getAttribute(AdminConstants.A_CATEGORY); if (category.equalsIgnoreCase(AddAccountLogger.CATEGORY_ALL)) { category = null; - } else if (!LogFactory.logExists(category)) { + } else if (!((LoggerContext) LogManager.getContext(false)).hasLogger(category)) { throw ServiceException.INVALID_REQUEST("Log category " + category + " does not exist.", null); } } diff --git a/store/src/java/org/apache/mina/transport/socket/nio/ZimbraSocketAcceptor.java b/store/src/java/org/apache/mina/transport/socket/nio/ZimbraSocketAcceptor.java index 500ca116e41..5bb73ab2634 100644 --- a/store/src/java/org/apache/mina/transport/socket/nio/ZimbraSocketAcceptor.java +++ b/store/src/java/org/apache/mina/transport/socket/nio/ZimbraSocketAcceptor.java @@ -23,6 +23,7 @@ import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; +import java.nio.channels.spi.SelectorProvider; import java.util.Collection; import java.util.Iterator; import java.util.concurrent.Executor; @@ -238,4 +239,9 @@ public void remove() { } } + @Override + protected void init(SelectorProvider arg0) throws Exception { + selector = Selector.open(); + } + }