diff --git a/build-ivysettings.xml b/build-ivysettings.xml
index 0cb55298013..d58d40b23aa 100644
--- a/build-ivysettings.xml
+++ b/build-ivysettings.xml
@@ -4,7 +4,9 @@
-
+
+
+
diff --git a/client/ivy.xml b/client/ivy.xml
index d2f700f7318..95ccfbf8f2c 100644
--- a/client/ivy.xml
+++ b/client/ivy.xml
@@ -9,7 +9,8 @@
-
+
+
diff --git a/common/ivy.xml b/common/ivy.xml
index 7f0b5aa7325..961a59ba4cb 100644
--- a/common/ivy.xml
+++ b/common/ivy.xml
@@ -16,7 +16,8 @@
-
+
+
diff --git a/common/src/java/com/zimbra/common/util/Log.java b/common/src/java/com/zimbra/common/util/Log.java
index 7d12a22a302..e184369a669 100644
--- a/common/src/java/com/zimbra/common/util/Log.java
+++ b/common/src/java/com/zimbra/common/util/Log.java
@@ -22,7 +22,9 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.core.config.Configurator;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import com.google.common.collect.ImmutableMap;
@@ -36,23 +38,23 @@ public class Log {
private final Map mAccountLoggers = new ConcurrentHashMap();
- private static final Map ZIMBRA_TO_LOG4J =
- new EnumMap(Level.class);
+ private static final Map ZIMBRA_TO_LOG4J =
+ new EnumMap(Level.class);
static {
- ZIMBRA_TO_LOG4J.put(Level.error, org.apache.log4j.Level.ERROR);
- ZIMBRA_TO_LOG4J.put(Level.warn, org.apache.log4j.Level.WARN);
- ZIMBRA_TO_LOG4J.put(Level.info, org.apache.log4j.Level.INFO);
- ZIMBRA_TO_LOG4J.put(Level.debug, org.apache.log4j.Level.DEBUG);
- ZIMBRA_TO_LOG4J.put(Level.trace, org.apache.log4j.Level.TRACE);
- }
- private static final Map LOG4J_TO_ZIMBRA =
- new ImmutableMap.Builder()
- .put(org.apache.log4j.Level.FATAL, Level.error)
- .put(org.apache.log4j.Level.ERROR, Level.error)
- .put(org.apache.log4j.Level.WARN, Level.warn)
- .put(org.apache.log4j.Level.INFO, Level.info)
- .put(org.apache.log4j.Level.DEBUG, Level.debug)
- .put(org.apache.log4j.Level.TRACE, Level.trace)
+ ZIMBRA_TO_LOG4J.put(Level.error, org.apache.logging.log4j.Level.ERROR);
+ ZIMBRA_TO_LOG4J.put(Level.warn, org.apache.logging.log4j.Level.WARN);
+ ZIMBRA_TO_LOG4J.put(Level.info, org.apache.logging.log4j.Level.INFO);
+ ZIMBRA_TO_LOG4J.put(Level.debug, org.apache.logging.log4j.Level.DEBUG);
+ ZIMBRA_TO_LOG4J.put(Level.trace, org.apache.logging.log4j.Level.TRACE);
+ }
+ private static final Map LOG4J_TO_ZIMBRA =
+ new ImmutableMap.Builder()
+ .put(org.apache.logging.log4j.Level.FATAL, Level.error)
+ .put(org.apache.logging.log4j.Level.ERROR, Level.error)
+ .put(org.apache.logging.log4j.Level.WARN, Level.warn)
+ .put(org.apache.logging.log4j.Level.INFO, Level.info)
+ .put(org.apache.logging.log4j.Level.DEBUG, Level.debug)
+ .put(org.apache.logging.log4j.Level.TRACE, Level.trace)
.build();
public enum Level {
@@ -85,10 +87,10 @@ public void addAccountLogger(String accountName, Level level) {
Logger accountLogger = mAccountLoggers.get(accountName);
if (accountLogger == null) {
String accountCategory = getAccountCategory(getCategory(), accountName);
- accountLogger = Logger.getLogger(accountCategory);
+ accountLogger = LogManager.getLogger(accountCategory);
mAccountLoggers.put(accountName, accountLogger);
}
- accountLogger.setLevel(ZIMBRA_TO_LOG4J.get(level));
+ Configurator.setLevel(accountLogger.getName(), ZIMBRA_TO_LOG4J.get(level));
}
/**
@@ -134,15 +136,15 @@ public boolean isInfoEnabled() {
}
public boolean isWarnEnabled() {
- return getLogger().isEnabledFor(org.apache.log4j.Level.WARN);
+ return getLogger().isEnabled(org.apache.logging.log4j.Level.WARN);
}
public boolean isErrorEnabled() {
- return getLogger().isEnabledFor(org.apache.log4j.Level.ERROR);
+ return getLogger().isEnabled(org.apache.logging.log4j.Level.ERROR);
}
public boolean isFatalEnabled() {
- return getLogger().isEnabledFor(org.apache.log4j.Level.FATAL);
+ return getLogger().isEnabled(org.apache.logging.log4j.Level.FATAL);
}
public void trace(Object o) {
@@ -443,16 +445,16 @@ public void errorQuietly(String format, Object o, Throwable t) {
/**
* Returns Log4j equivalent of {@code level} or org.apache.log4j.Level.TRACE
*/
- private static final org.apache.log4j.Level log4jLevel(Level level) {
- org.apache.log4j.Level log4jlevel = ZIMBRA_TO_LOG4J.get(level);
+ private static final org.apache.logging.log4j.Level log4jLevel(Level level) {
+ org.apache.logging.log4j.Level log4jlevel = ZIMBRA_TO_LOG4J.get(level);
if (log4jlevel == null) {
- log4jlevel = org.apache.log4j.Level.TRACE;
+ log4jlevel = org.apache.logging.log4j.Level.TRACE;
}
return log4jlevel;
}
public boolean isEnabledFor(Level level) {
- return getLogger().isEnabledFor(log4jLevel(level));
+ return getLogger().isEnabled(log4jLevel(level));
}
public void fatal(Object o) {
@@ -545,7 +547,7 @@ public void log(Level level, String format, Object o1, Object o2, Object o3, Obj
public void setLevel(Level level) {
- mLogger.setLevel(ZIMBRA_TO_LOG4J.get(level));
+ Configurator.setLevel(mLogger.getName(), ZIMBRA_TO_LOG4J.get(level));
}
public Level getLevel() {
diff --git a/common/src/java/com/zimbra/common/util/LogFactory.java b/common/src/java/com/zimbra/common/util/LogFactory.java
index 821d7a7de9c..ad7ff4a1743 100644
--- a/common/src/java/com/zimbra/common/util/LogFactory.java
+++ b/common/src/java/com/zimbra/common/util/LogFactory.java
@@ -22,9 +22,8 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
-import org.apache.log4j.PropertyConfigurator;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.core.config.Configurator;
import com.zimbra.common.localconfig.LC;
@@ -41,7 +40,7 @@ private LogFactory() {
}
public synchronized static void init() {
- PropertyConfigurator.configure(LC.zimbra_log4j_properties.value());
+ Configurator.initialize(null, LC.zimbra_log4j_properties.value());
}
public synchronized static void reset() {
@@ -51,8 +50,8 @@ public synchronized static void reset() {
for (Log log : getAllLoggers()) {
log.removeAccountLoggers();
}
- LogManager.resetConfiguration();
- PropertyConfigurator.configure(LC.zimbra_log4j_properties.value());
+ LogManager.shutdown(true);
+ Configurator.initialize(null, LC.zimbra_log4j_properties.value());
}
public static Log getLog(Class> clazz) {
@@ -65,7 +64,7 @@ public static Log getLog(Class> clazz) {
public static Log getLog(String name) {
Log log = NAME2LOG.get(name);
if (log == null) {
- log = new Log(Logger.getLogger(name));
+ log = new Log(LogManager.getLogger(name));
Log prev = NAME2LOG.putIfAbsent(name, log);
if (prev != null) {
log = prev;
@@ -78,7 +77,7 @@ public static Log getLog(String name) {
* Returns true if a logger with the given name exists.
*/
public static boolean logExists(String name) {
- return (LogManager.exists(name) != null);
+ return (LogManager.exists(name));
}
/**
diff --git a/common/src/java/com/zimbra/common/util/ZimbraLog.java b/common/src/java/com/zimbra/common/util/ZimbraLog.java
index 389be8c95ea..803bdd12182 100644
--- a/common/src/java/com/zimbra/common/util/ZimbraLog.java
+++ b/common/src/java/com/zimbra/common/util/ZimbraLog.java
@@ -24,11 +24,23 @@
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.log4j.PropertyConfigurator;
+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;
+
/**
* Log categories.
@@ -485,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() {
}
@@ -850,22 +881,39 @@ 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);
+ }
+ builder.add(appenderBuilder.add(layoutBuilder));
+
+ if (null != logFile) {
+ // 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));
}
- PropertyConfigurator.configure(p);
+ builder.add(builder.newRootLogger(level)
+ .add(builder.newAppenderRef(DEFAULT_APPENDER_NAME)));
+ Configurator.initialize(builder.build());
}
public static void toolSetupLog4jConsole(String defaultLevel, boolean stderr, boolean showThreads) {
@@ -873,21 +921,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);
}
- PropertyConfigurator.configure(p);
- }
+ 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
@@ -899,7 +958,10 @@ public static void toolSetupLog4jConsole(String defaultLevel, boolean stderr, bo
*/
public static void toolSetupLog4j(String defaultLevel, String propsFile) {
if (propsFile != null && new File(propsFile).exists()) {
- PropertyConfigurator.configure(propsFile);
+ LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
+ File file = new File(LC.zimbra_log4j_properties.value());
+ // this will force a reconfiguration
+ context.setConfigLocation(file.toURI());
} else {
toolSetupLog4j(defaultLevel, null, false);
}
diff --git a/common/src/java/com/zimbra/common/util/ZimbraPatternLayout.java b/common/src/java/com/zimbra/common/util/ZimbraPatternLayout.java
index 833f6b2fdfd..a2a149169da 100644
--- a/common/src/java/com/zimbra/common/util/ZimbraPatternLayout.java
+++ b/common/src/java/com/zimbra/common/util/ZimbraPatternLayout.java
@@ -1,59 +1,26 @@
-/*
- * ***** BEGIN LICENSE BLOCK *****
- * Zimbra Collaboration Suite Server
- * Copyright (C) 2007, 2009, 2010, 2013, 2014, 2016 Synacor, Inc.
- *
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software Foundation,
- * version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- * You should have received a copy of the GNU General Public License along with this program.
- * If not, see .
- * ***** END LICENSE BLOCK *****
- */
package com.zimbra.common.util;
-import org.apache.log4j.Category;
-import org.apache.log4j.ConsoleAppender;
-import org.apache.log4j.Layout;
-import org.apache.log4j.PatternLayout;
-import org.apache.log4j.helpers.PatternParser;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.pattern.ConverterKeys;
+import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
-/**
- * Subclasses Log4J's PatternLayout class to add additional support for
- * the %z option, which prints the value returned by {@link ZimbraLog#getContextString()}.
- *
- * @author bburtin
- */
-public class ZimbraPatternLayout extends PatternLayout {
+@Plugin(name = "ZimbraPatternLayout", category = "Converter")
+@ConverterKeys({ "z" })
+public class ZimbraPatternLayout extends LogEventPatternConverter {
- public ZimbraPatternLayout() {
- this(DEFAULT_CONVERSION_PATTERN);
+ protected ZimbraPatternLayout(String name, String style) {
+ super(name, style);
}
-
- public ZimbraPatternLayout(String pattern) {
- super(pattern);
+
+ public static ZimbraPatternLayout newInstance(String[] options)
+ {
+ return new ZimbraPatternLayout("z", Thread.currentThread().getName());
}
- public PatternParser createPatternParser(String pattern) {
- if (pattern == null) {
- pattern = DEFAULT_CONVERSION_PATTERN;
- }
- return new ZimbraPatternParser(pattern, this);
+ @Override
+ public void format(LogEvent event, StringBuilder toAppendTo) {
+ toAppendTo.append(ZimbraLog.getContextString() == null ? "" : ZimbraLog.getContextString());
}
-
- public static void main(String[] args) {
- Layout layout = new ZimbraPatternLayout("[%z] - %m%n");
- Category cat = Category.getInstance("some.cat");
- cat.addAppender(new ConsoleAppender(layout, ConsoleAppender.SYSTEM_OUT));
- ZimbraLog.addAccountNameToContext("my@account.com");
- ZimbraLog.addMboxToContext(99);
- cat.debug("Hello, log");
- cat.info("Hello again...");
- ZimbraLog.clearContext();
- cat.info("No more context");
- }
-}
+
+}
\ No newline at end of file
diff --git a/common/src/java/com/zimbra/common/util/ZimbraPatternParser.java b/common/src/java/com/zimbra/common/util/ZimbraPatternParser.java
deleted file mode 100644
index 0436de0edc4..00000000000
--- a/common/src/java/com/zimbra/common/util/ZimbraPatternParser.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * ***** BEGIN LICENSE BLOCK *****
- * Zimbra Collaboration Suite Server
- * Copyright (C) 2007, 2009, 2010, 2013, 2014, 2016 Synacor, Inc.
- *
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software Foundation,
- * version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- * You should have received a copy of the GNU General Public License along with this program.
- * If not, see .
- * ***** END LICENSE BLOCK *****
- */
-package com.zimbra.common.util;
-
-import org.apache.log4j.helpers.FormattingInfo;
-import org.apache.log4j.helpers.PatternConverter;
-import org.apache.log4j.helpers.PatternParser;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- * Formats the %z pattern as all the keys and values passed
- * to {@link ZimbraLog#addToContext}.
- *
- * @author bburtin
- */
-public class ZimbraPatternParser
-extends PatternParser {
-
- ZimbraPatternLayout mLayout;
-
- ZimbraPatternParser(String pattern, ZimbraPatternLayout layout) {
- super(pattern);
- mLayout = layout;
- }
-
- public void finalizeConverter(char c) {
- if (c == 'z') {
- addConverter(new ZimbraPatternConverter(formattingInfo));
- currentLiteral.setLength(0);
- } else {
- super.finalizeConverter(c);
- }
- }
-
- private class ZimbraPatternConverter extends PatternConverter {
- ZimbraPatternConverter(FormattingInfo formattingInfo) {
- super(formattingInfo);
- }
-
- public String convert(LoggingEvent event) {
- return ZimbraLog.getContextString();
- }
- }
-}
diff --git a/milter-conf/conf/milter.log4j.properties b/milter-conf/conf/milter.log4j.properties
index d24db8990c5..c06ac349fd9 100644
--- a/milter-conf/conf/milter.log4j.properties
+++ b/milter-conf/conf/milter.log4j.properties
@@ -1,20 +1,34 @@
-# An example log4j configuration file that outputs to System.out. The
-# output information consists of relative time, log level, thread
-# name, logger name, nested diagnostic context and the message in that
-# order.
+status = error
+dest = err
+name = PropertiesConfig
+packages = com.zimbra
-# For the general syntax of property based configuration files see the
-# documenation of org.apache.log4j.PropertyConfigurator.
+# Appender MILTER writes to the file "/opt/zimbra/log/mailbox.log".
+# Daily rolling policy with compressing the old log file while rotating!!
+# The archived log files location can be changed using FileNamePattern value
-log4j.threshhold=OFF
-log4j.rootLogger=INFO,MILTER
-log4j.appender.MILTER=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.MILTER.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.MILTER.RollingPolicy.FileNamePattern=/opt/zimbra/log/milter.log.%d{yyyy-MM-dd}
-log4j.appender.MILTER.File=/opt/zimbra/log/milter.log
-log4j.appender.MILTER.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.MILTER.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
-log4j.additivity.zimbra.milter=false
-log4j.logger.zimbra.milter=INFO,MILTER
-log4j.additivity.zimbra.security=false
-log4j.logger.zimbra.security=INFO,MILTER
+# Reference https://logging.apache.org/log4j/2.0/manual/configuration.html#ConfigurationSyntax
+
+appender.MILTER.type = RollingFile
+appender.MILTER.name = milterFile
+appender.MILTER.fileName = /opt/zimbra/log/milter.log
+appender.MILTER.filePattern = /opt/zimbra/log/milter.log.%d{yyyy-MM-dd}
+appender.MILTER.layout.type = PatternLayout
+appender.MILTER.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.MILTER.policies.type = Policies
+appender.MILTER.policies.time.type = TimeBasedTriggeringPolicy
+appender.MILTER.policies.time.interval = 2
+appender.MILTER.policies.time.modulate = true
+appender.MILTER.strategy.type = DefaultRolloverStrategy
+
+logger.milter.name = zimbra.milter
+logger.milter.level = info,MILTER
+logger.milter.additivity = false
+logger.milter.appenderRef.MILTER.ref = milterFile
+
+logger.security.name = zimbra.security
+logger.security.level = info,MILTER
+logger.security.additivity = false
+
+rootLogger=info,MILTER
+rootLogger.appenderRef.MILTER.ref = milterFile
diff --git a/soap/ivy-soapdoclet.xml b/soap/ivy-soapdoclet.xml
index f6fc9964497..c52f131c946 100644
--- a/soap/ivy-soapdoclet.xml
+++ b/soap/ivy-soapdoclet.xml
@@ -4,7 +4,8 @@
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
-
+
+
diff --git a/soap/ivy-tools.xml b/soap/ivy-tools.xml
index 7d27c0f5560..4cd36003ceb 100644
--- a/soap/ivy-tools.xml
+++ b/soap/ivy-tools.xml
@@ -6,7 +6,8 @@
-
+
+
diff --git a/soap/ivy.xml b/soap/ivy.xml
index 494261d91eb..949f367a357 100644
--- a/soap/ivy.xml
+++ b/soap/ivy.xml
@@ -17,7 +17,8 @@
-
+
+
diff --git a/soap/src/java/com/zimbra/soap/util/Jaxb2Xsds.java b/soap/src/java/com/zimbra/soap/util/Jaxb2Xsds.java
index 277fb0e7a7f..13d01d3eee5 100644
--- a/soap/src/java/com/zimbra/soap/util/Jaxb2Xsds.java
+++ b/soap/src/java/com/zimbra/soap/util/Jaxb2Xsds.java
@@ -27,9 +27,9 @@
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;
-import org.apache.log4j.BasicConfigurator;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.core.config.Configurator;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
@@ -39,16 +39,14 @@
/**
*/
public class Jaxb2Xsds {
- private static final Logger LOG = Logger.getLogger(Jaxb2Xsds.class);
private static final String ARG_DIR = "--dir";
private static String dir = null;
static {
- BasicConfigurator.configure();
- Logger.getRootLogger().setLevel(Level.INFO);
- LOG.setLevel(Level.INFO);
+ Configurator.setLevel(LogManager.getRootLogger().getName(), Level.INFO);
+ Configurator.setLevel(LogManager.getLogger(Jaxb2Xsds.class).getName(), Level.INFO);
}
/**
* Main
@@ -57,10 +55,11 @@ public static void main(String[] args) throws Exception {
readArguments(args);
createXsds();
}
-
+
/**
* Reads the command line arguments.
*/
+
private static void readArguments(String[] args) {
int argPos = 0;
diff --git a/soap/src/java/com/zimbra/soap/util/XsdCleaner.java b/soap/src/java/com/zimbra/soap/util/XsdCleaner.java
index 85b8dcd8205..7eef6d69dce 100644
--- a/soap/src/java/com/zimbra/soap/util/XsdCleaner.java
+++ b/soap/src/java/com/zimbra/soap/util/XsdCleaner.java
@@ -37,9 +37,10 @@
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
-import org.apache.log4j.BasicConfigurator;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.config.Configurator;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
@@ -52,13 +53,14 @@
import com.zimbra.common.util.ZimbraLog;
+
/**
* This class adjusts the .xsd files automatically generated from JAXB classes to work better for WSDL.
* For instance, the adjustments include a workaround for a wsdl.exe code generation issue
* See http://connect.microsoft.com/VisualStudio/feedback/details/471297
*/
public class XsdCleaner {
- private static final Logger LOG = Logger.getLogger(XsdCleaner.class);
+ private static final Logger LOG = LogManager.getLogger(XsdCleaner.class);
private static final String ARG_DIR = "--dir";
private static final String KEEP_BACKUPS = "--keep.backups";
@@ -67,9 +69,8 @@ public class XsdCleaner {
private static boolean keepBackups = false;
static {
- BasicConfigurator.configure();
- Logger.getRootLogger().setLevel(Level.INFO);
- LOG.setLevel(Level.INFO);
+ Configurator.setLevel(LogManager.getRootLogger().getName(), Level.INFO);
+ Configurator.setLevel(LogManager.getLogger(XsdCleaner.class).getName(), Level.INFO);
}
/**
* Main
diff --git a/store-conf/conf/imapd.log4j.properties b/store-conf/conf/imapd.log4j.properties
index bb587aaf3b2..bfa935e0e6c 100755
--- a/store-conf/conf/imapd.log4j.properties
+++ b/store-conf/conf/imapd.log4j.properties
@@ -4,7 +4,12 @@
# order.
# For the general syntax of property based configuration files see the
-# documenation of org.apache.log4j.PropertyConfigurator.
+# Reference https://logging.apache.org/log4j/2.0/manual/configuration.html#ConfigurationSyntax
+
+status = error
+dest = err
+name = PropertiesConfig
+packages = com.zimbra
log4j.threshhold=OFF
@@ -14,40 +19,64 @@ log4j.rootLogger=INFO,LOGFILE
# Appender LOGFILE writes to the file "/opt/zimbra/log/imapd.log".
# Daily rolling policy with compressing the old log file while rotating!!
# The archived log files location can be changed using FileNamePattern value
-log4j.appender.LOGFILE=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.LOGFILE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.LOGFILE.RollingPolicy.FileNamePattern=/opt/zimbra/log/imapd.log.%d{yyyy-MM-dd}
-log4j.appender.LOGFILE.File=/opt/zimbra/log/imapd.log
-log4j.appender.LOGFILE.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.LOGFILE.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
-
+appender.LOGFILE.type = RollingFile
+appender.LOGFILE.name = imapdFile
+appender.LOGFILE.fileName = /opt/zimbra/log/imapd.log
+appender.LOGFILE.filePattern = /opt/zimbra/log/imapd.log.%d{yyyy-MM-dd}
+appender.LOGFILE.layout.type = PatternLayout
+appender.LOGFILE.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.LOGFILE.policies.type = Policies
+appender.LOGFILE.policies.time.type = TimeBasedTriggeringPolicy
+appender.LOGFILE.policies.time.interval = 2
+appender.LOGFILE.policies.time.modulate = true
+appender.LOGFILE.strategy.type = DefaultRolloverStrategy
+
# Appender AUDIT writes to the file "imapd-audit.log".
-log4j.appender.AUDIT=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.AUDIT.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.AUDIT.RollingPolicy.FileNamePattern=/opt/zimbra/log/imapd-audit.log.%d{yyyy-MM-dd}
-log4j.appender.AUDIT.File=/opt/zimbra/log/imapd-audit.log
-log4j.appender.AUDIT.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.AUDIT.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
-
-# Save zimbra.security to AUDIT appender
-log4j.additivity.zimbra.security=false
-log4j.logger.zimbra.security=INFO,AUDIT
+appender.AUDIT.type = RollingFile
+appender.AUDIT.name = auditFile
+appender.AUDIT.fileName = /opt/zimbra/log/imapd-audit.log
+appender.AUDIT.filePattern = /opt/zimbra/log/imapd-audit.log.%d{yyyy-MM-dd}
+appender.AUDIT.layout.type = PatternLayout
+appender.AUDIT.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.AUDIT.policies.type = Policies
+appender.AUDIT.policies.time.type = TimeBasedTriggeringPolicy
+appender.AUDIT.policies.time.interval = 2
+appender.AUDIT.policies.time.modulate = true
+appender.AUDIT.strategy.type = DefaultRolloverStrategy
# Syslog appender
-log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
-log4j.appender.SYSLOG.SyslogHost=localhost
-log4j.appender.SYSLOG.Facility=LOCAL0
-log4j.appender.SYSLOG.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.SYSLOG.layout.ConversionPattern=imap: %-5p [%t] [%z] %c{1} - %m
+appender.SYSLOG.type = Syslog
+appender.SYSLOG.name = syslogAppender
+appender.SYSLOG.host = localhost
+appender.SYSLOG.facility = LOCAL0
+appender.SYSLOG.layout.type = PatternLayout
+appender.SYSLOG.layout.pattern = imap: %-5p [%t] [%z] %c{1} - %m
+
+logger.zimbra.name = zimbra.imap
+logger.zimbra.level = info
+logger.zimbra.additivity = false
+logger.zimbra.appenderRef.LOGFILE.ref = imapdFile
+logger.imap-client.name = zimbra.imap-client
+logger.imap-client.level = info
+logger.imap-client.additivity = false
+
+# Save zimbra.security to AUDIT appender
+logger.security.name = zimbra.security
+logger.security.level = debug, AUDIT
+logger.security.additivity = false
+logger.security.appenderRef.AUDIT.ref = auditFile
+
+logger.syslog.name = com.zimbra
+logger.syslog.level = debug
+logger.syslog.additivity = false
+logger.syslog.appenderRef.SYSLOG.ref = syslogAppender
# HttpMethodBase spews out too many WARN on the badly formatted cookies.
-log4j.logger.org.apache.commons.httpclient.HttpMethodBase=ERROR
+#log4j.logger.org.apache.commons.httpclient.HttpMethodBase=ERROR
# spymemcached is too verbose at INFO level.
-log4j.logger.net.spy.memcached=WARN
-
-log4j.logger.zimbra=INFO
-log4j.logger.zimbra.op=WARN
-log4j.logger.com.zimbra=INFO
+#log4j.logger.net.spy.memcached=WARN
+rootLogger.level=info
+rootLogger.appenderRef.LOGFILE.ref = imapdFile
diff --git a/store-conf/conf/log4j.properties b/store-conf/conf/log4j.properties
index 5e2ac0ae84b..ef70352eeb4 100644
--- a/store-conf/conf/log4j.properties
+++ b/store-conf/conf/log4j.properties
@@ -1,142 +1,240 @@
-# An example log4j configuration file that outputs to System.out. The
-# output information consists of relative time, log level, thread
-# name, logger name, nested diagnostic context and the message in that
-# order.
+status = error
+dest = err
+name = PropertiesConfig
+packages = com.zimbra
-# For the general syntax of property based configuration files see the
-# documenation of org.apache.log4j.PropertyConfigurator.
-
-log4j.threshhold=OFF
-
-log4j.rootLogger=INFO,CONSOLE,LOGFILE
-
-# CONSOLE is set to be a ConsoleAppender which outputs to System.out.
-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
-log4j.appender.CONSOLE.layout=com.zimbra.common.util.ZimbraPatternLayout
-
-# The conversion pattern uses format specifiers. You might want to
-# change the pattern an watch the output format change.
-log4j.appender.CONSOLE.layout.ConversionPattern=%-4r %-5p [%t] [%z] %c{1} - %m%n
-
-# Appender LOGFILE writes to the file "mailbox.log".
+# Appender LOGFILE writes to the file "/opt/zimbra/log/mailbox.log".
# Daily rolling policy with compressing the old log file while rotating!!
# The archived log files location can be changed using FileNamePattern value
-log4j.appender.LOGFILE=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.LOGFILE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.LOGFILE.RollingPolicy.FileNamePattern=/opt/zimbra/log/mailbox.log.%d{yyyy-MM-dd}
-log4j.appender.LOGFILE.File=/opt/zimbra/log/mailbox.log
-log4j.appender.LOGFILE.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.LOGFILE.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+# Reference https://logging.apache.org/log4j/2.0/manual/configuration.html#ConfigurationSyntax
+
+appender.A1.type = Console
+appender.A1.name = STDOUT
+appender.A1.layout.type = PatternLayout
+appender.A1.layout.pattern = %m%n
+
+appender.LOGFILE.type = RollingFile
+appender.LOGFILE.name = mailboxFile
+appender.LOGFILE.fileName = /opt/zimbra/log/mailbox.log
+appender.LOGFILE.filePattern = /opt/zimbra/log/mailbox.log.%d{yyyy-MM-dd}
+appender.LOGFILE.layout.type = PatternLayout
+appender.LOGFILE.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.LOGFILE.policies.type = Policies
+appender.LOGFILE.policies.time.type = TimeBasedTriggeringPolicy
+appender.LOGFILE.policies.time.interval = 2
+appender.LOGFILE.policies.time.modulate = true
+appender.LOGFILE.strategy.type = DefaultRolloverStrategy
+
# Appender AUDIT writes to the file "audit.log".
-log4j.appender.AUDIT=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.AUDIT.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.AUDIT.RollingPolicy.FileNamePattern=/opt/zimbra/log/audit.log.%d{yyyy-MM-dd}
-log4j.appender.AUDIT.File=/opt/zimbra/log/audit.log
-log4j.appender.AUDIT.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.AUDIT.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.AUDIT.type = RollingFile
+appender.AUDIT.name = auditFile
+appender.AUDIT.fileName = /opt/zimbra/log/audit.log
+appender.AUDIT.filePattern = /opt/zimbra/log/audit.log.%d{yyyy-MM-dd}
+appender.AUDIT.layout.type = PatternLayout
+appender.AUDIT.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.AUDIT.policies.type = Policies
+appender.AUDIT.policies.time.type = TimeBasedTriggeringPolicy
+appender.AUDIT.policies.time.interval = 2
+appender.AUDIT.policies.time.modulate = true
+appender.AUDIT.strategy.type = DefaultRolloverStrategy
# Appender SYNC writes to the file "sync.log".
-log4j.appender.SYNC=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.SYNC.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.SYNC.RollingPolicy.FileNamePattern=/opt/zimbra/log/sync.log.%d{yyyy-MM-dd}
-log4j.appender.SYNC.File=/opt/zimbra/log/sync.log
-log4j.appender.SYNC.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.SYNC.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.SYNC.type = RollingFile
+appender.SYNC.name = syncFile
+appender.SYNC.fileName = /opt/zimbra/log/sync.log
+appender.SYNC.filePattern = /opt/zimbra/log/sync.log.%d{yyyy-MM-dd}
+appender.SYNC.layout.type = PatternLayout
+appender.SYNC.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.SYNC.policies.type = Policies
+appender.SYNC.policies.time.type = TimeBasedTriggeringPolicy
+appender.SYNC.policies.time.interval = 2
+appender.SYNC.policies.time.modulate = true
+appender.SYNC.strategy.type = DefaultRolloverStrategy
# Appender SYNCTRACE writes to the file "synctrace.log".
-log4j.appender.SYNCTRACE=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.SYNCTRACE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.SYNCTRACE.RollingPolicy.FileNamePattern=/opt/zimbra/log/synctrace.log.%d{yyyy-MM-dd}
-log4j.appender.SYNCTRACE.File=/opt/zimbra/log/synctrace.log
-log4j.appender.SYNCTRACE.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.SYNCTRACE.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.SYNCTRACE.type = RollingFile
+appender.SYNCTRACE.name = syncTraceFile
+appender.SYNCTRACE.fileName = /opt/zimbra/log/synctrace.log
+appender.SYNCTRACE.filePattern = /opt/zimbra/log/synctrace.log.%d{yyyy-MM-dd}
+appender.SYNCTRACE.layout.type = PatternLayout
+appender.SYNCTRACE.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.SYNCTRACE.policies.type = Policies
+appender.SYNCTRACE.policies.time.type = TimeBasedTriggeringPolicy
+appender.SYNCTRACE.policies.time.interval = 2
+appender.SYNCTRACE.policies.time.modulate = true
+appender.SYNCTRACE.strategy.type = DefaultRolloverStrategy
# Appender SYNCSTATE writes to the file "syncstate.log".
-log4j.appender.SYNCSTATE=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.SYNCSTATE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.SYNCSTATE.RollingPolicy.FileNamePattern=/opt/zimbra/log/syncstate.log.%d{yyyy-MM-dd}
-log4j.appender.SYNCSTATE.File=/opt/zimbra/log/syncstate.log
-log4j.appender.SYNCSTATE.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.SYNCSTATE.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.SYNCSTATE.type = RollingFile
+appender.SYNCSTATE.name = syncStateFile
+appender.SYNCSTATE.fileName = /opt/zimbra/log/syncstate.log
+appender.SYNCSTATE.filePattern = /opt/zimbra/log/syncstate.log.%d{yyyy-MM-dd}
+appender.SYNCSTATE.layout.type = PatternLayout
+appender.SYNCSTATE.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.SYNCSTATE.policies.type = Policies
+appender.SYNCSTATE.policies.time.type = TimeBasedTriggeringPolicy
+appender.SYNCSTATE.policies.time.interval = 2
+appender.SYNCSTATE.policies.time.modulate = true
+appender.SYNCSTATE.strategy.type = DefaultRolloverStrategy
# Appender WBXML writes to the file "wbxml.log".
-log4j.appender.WBXML=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.WBXML.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.WBXML.RollingPolicy.FileNamePattern=/opt/zimbra/log/wbxml.log.%d{yyyy-MM-dd}
-log4j.appender.WBXML.File=/opt/zimbra/log/wbxml.log
-log4j.appender.WBXML.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.WBXML.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.WBXML.type = RollingFile
+appender.WBXML.name = wbXmlFile
+appender.WBXML.fileName = /opt/zimbra/log/wbxml.log
+appender.WBXML.filePattern = /opt/zimbra/log/wbxml.log.%d{yyyy-MM-dd}
+appender.WBXML.layout.type = PatternLayout
+appender.WBXML.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.WBXML.policies.type = Policies
+appender.WBXML.policies.time.type = TimeBasedTriggeringPolicy
+appender.WBXML.policies.time.interval = 2
+appender.WBXML.policies.time.modulate = true
+appender.WBXML.strategy.type = DefaultRolloverStrategy
# Appender ACTIVITY writes to the file "activity.log".
-log4j.appender.ACTIVITY=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.ACTIVITY.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.ACTIVITY.RollingPolicy.FileNamePattern=/opt/zimbra/log/activity.log.%d{yyyy-MM-dd}
-log4j.appender.ACTIVITY.File=/opt/zimbra/log/activity.log
-log4j.appender.ACTIVITY.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.ACTIVITY.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.ACTIVITY.type = RollingFile
+appender.ACTIVITY.name = activityFile
+appender.ACTIVITY.fileName = /opt/zimbra/log/activity.log
+appender.ACTIVITY.filePattern = /opt/zimbra/log/activity.log.%d{yyyy-MM-dd}
+appender.ACTIVITY.layout.type = PatternLayout
+appender.ACTIVITY.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.ACTIVITY.policies.type = Policies
+appender.ACTIVITY.policies.time.type = TimeBasedTriggeringPolicy
+appender.ACTIVITY.policies.time.interval = 2
+appender.ACTIVITY.policies.time.modulate = true
+appender.ACTIVITY.strategy.type = DefaultRolloverStrategy
# Appender SEARCHSTAT writes to the file "searchstat.log".
-log4j.appender.SEARCHSTAT=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.SEARCHSTAT.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.SEARCHSTAT.RollingPolicy.FileNamePattern=/opt/zimbra/log/searchstat.log.%d{yyyy-MM-dd}
-log4j.appender.SEARCHSTAT.File=/opt/zimbra/log/searchstat.log
-log4j.appender.SEARCHSTAT.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.SEARCHSTAT.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.SEARCHSTAT.type = RollingFile
+appender.SEARCHSTAT.name = searchStatFile
+appender.SEARCHSTAT.fileName = /opt/zimbra/log/searchstat.log
+appender.SEARCHSTAT.filePattern = /opt/zimbra/log/searchstat.log.%d{yyyy-MM-dd}
+appender.SEARCHSTAT.layout.type = PatternLayout
+appender.SEARCHSTAT.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.SEARCHSTAT.policies.type = Policies
+appender.SEARCHSTAT.policies.time.type = TimeBasedTriggeringPolicy
+appender.SEARCHSTAT.policies.time.interval = 2
+appender.SEARCHSTAT.policies.time.modulate = true
+appender.SEARCHSTAT.strategy.type = DefaultRolloverStrategy
# Appender EWS writes to the file "ews.log".
-log4j.appender.EWS=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.EWS.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.EWS.RollingPolicy.FileNamePattern=/opt/zimbra/log/ews.log.%d{yyyy-MM-dd}
-log4j.appender.EWS.File=/opt/zimbra/log/ews.log
-log4j.appender.EWS.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.EWS.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.EWS.type = RollingFile
+appender.EWS.name = ewsFile
+appender.EWS.fileName = /opt/zimbra/log/ews.log
+appender.EWS.filePattern = /opt/zimbra/log/ews.log.%d{yyyy-MM-dd}
+appender.EWS.layout.type = PatternLayout
+appender.EWS.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.EWS.policies.type = Policies
+appender.EWS.policies.time.type = TimeBasedTriggeringPolicy
+appender.EWS.policies.time.interval = 2
+appender.EWS.policies.time.modulate = true
+appender.EWS.strategy.type = DefaultRolloverStrategy
+
+# Syslog appender
+appender.SYSLOG.type = Syslog
+appender.SYSLOG.name = syslogAppender
+appender.SYSLOG.host = localhost
+appender.SYSLOG.facility = LOCAL0
+appender.SYSLOG.layout.type = PatternLayout
+appender.SYSLOG.layout.pattern = mailboxd: %-5p [%t] [%z] %c{1} - %m
+
+# Logger service appender
+appender.SLOGGER.type = Syslog
+appender.SLOGGER.name = sloggerAppender
+appender.SLOGGER.host = suchit.test.com
+appender.SLOGGER.facility = LOCAL1
+appender.SLOGGER.layout.type = PatternLayout
+appender.SLOGGER.layout.pattern = mailboxd: %-5p [%t] [%z] %c{1} - %m
+
+logger.zimbra.name = zimbra.mailbox
+logger.zimbra.level = debug
+logger.zimbra.additivity = false
+logger.zimbra.appenderRef.LOGFILE.ref = mailboxFile
# Save zimbra.security to AUDIT appender
-log4j.additivity.zimbra.security=false
-log4j.logger.zimbra.security=INFO,AUDIT
+logger.security.name = zimbra.security
+logger.security.level = debug, AUDIT
+logger.security.additivity = false
+logger.security.appenderRef.AUDIT.ref = auditFile
+
+logger.sync.name = zimbra.sync
+logger.sync.level = info,SYNC
+logger.sync.additivity = false
+logger.sync.appenderRef.SYNC.ref = syncFile
+
+logger.synctrace.name = zimbra.synctrace
+logger.synctrace.level = info,SYNCTRACE
+logger.synctrace.additivity = false
+logger.synctrace.appenderRef.SYNCTRACE.ref = syncTraceFile
+
+logger.syncstate.name = zimbra.syncstate
+logger.syncstate.level = info,SYNCSTATE
+logger.syncstate.additivity = false
+logger.syncstate.appenderRef.SYNCSTATE.ref = syncStateFile
+
+logger.wbxml.name = zimbra.wbxml
+logger.wbxml.level = info,WBXML
+logger.wbxml.additivity = false
+logger.wbxml.appenderRef.WBXML.ref = wbXmlFile
+
+logger.activity.name = zimbra.activity
+logger.activity.level = info,ACTIVITY
+logger.activity.additivity = false
+logger.activity.appenderRef.ACTIVITY.ref = activityFile
+
+logger.searchstat.name = zimbra.searchstat
+logger.searchstat.level = info,SEARCHSTAT
+logger.searchstat.additivity = false
+logger.searchstat.appenderRef.SEARCHSTAT.ref = searchStatFile
+
+logger.ews.name = zimbra.ews
+logger.ews.level = info,EWS
+logger.ews.additivity = false
+logger.ews.appenderRef.EWS.ref = ewsFile
+
+logger.syslog.name = com.zimbra
+logger.syslog.level = debug
+logger.syslog.additivity = false
+logger.syslog.appenderRef.SYSLOG.ref = syslogAppender
# HttpMethodBase spews out too many WARN on the badly formatted cookies.
-log4j.logger.org.apache.commons.httpclient.HttpMethodBase=ERROR
+logger.org.apache.commons.httpclient.HttpMethodBase=ERROR
# spymemcached is too verbose at INFO level.
-log4j.logger.net.spy.memcached=WARN
-
-#log4j.logger.httpclient=DEBUG
-#log4j.logger.org.apache.commons.httpclient=DEBUG
-#log4j.logger.com.zimbra.common.util.ZimbraHttpConnectionManager=DEBUG
-
-#log4j.logger.zimbra.imap=DEBUG
-log4j.logger.zimbra.test=DEBUG
-
-log4j.logger.com.zimbra=INFO
-#log4j.logger.com.zimbra=DEBUG
-log4j.logger.com.zimbra.soap.SoapEngine=DEBUG
-#log4j.logger.com.zimbra.cs.store.BlobChunk=DEBUG
-#log4j.logger.com.zimbra.cs.Archiver=DEBUG
-#log4j.logger.com.zimbra.cs=DEBUG
-#log4j.logger.com.zimbra.cs.index=DEBUG
-
-#log4j.logger.zimbra.sqltrace=DEBUG
-log4j.logger.com.zimbra.cs.service.util.SpamHandler=DEBUG
-
-log4j.additivity.zimbra.sync=false
-log4j.logger.zimbra.sync=INFO,SYNC
-log4j.additivity.zimbra.synctrace=false
-log4j.logger.zimbra.synctrace=TRACE,SYNCTRACE
-log4j.additivity.zimbra.syncstate=false
-log4j.logger.zimbra.syncstate=INFO,SYNCSTATE
-log4j.additivity.zimbra.wbxml=false
-log4j.logger.zimbra.wbxml=INFO,WBXML
-log4j.additivity.zimbra.activity=false
-log4j.logger.zimbra.activity=INFO,ACTIVITY
-log4j.additivity.zimbra.ews=false
-log4j.logger.zimbra.ews=INFO,EWS
-log4j.logger.zimbra.doc=DEBUG
-log4j.logger.zimbra.dav=DEBUG
-log4j.logger.zimbra.offline=DEBUG
-log4j.logger.zimbra.offline.request=INFO
-log4j.logger.zimbra.offline.response=INFO
-log4j.logger.zimbra.webclient=DEBUG
-log4j.logger.zimbra.slogger=OFF
-log4j.logger.zimbra.searchstat=INFO,SEARCHSTAT
+logger.net.spy.memcached=WARN
+
+logger.slogger.name = zimbra.slogger
+logger.slogger.level=INFO,SLOGGER
+#logger.slogger.level=ERROR
+logger.slogger.additivity = false
+logger.slogger.appenderRef.SLOGGER.ref = sloggerAppender
+
+logger.soapengine.name = com.zimbra.soap.SoapEngine
+logger.soapengine.level = debug
+
+logger.blobchunk.name = com.zimbra.cs.store.BlobChunk
+logger.blobchunk.level = debug
+
+logger.zimbracs.name = com.zimbra.cs
+logger.zimbracs.level = debug
+
+logger.zimbradoc.name = zimbra.doc
+logger.zimbradoc.level = debug
+
+logger.zimbraoffline.name = zimbra.offline
+logger.zimbraoffline.level = debug
+
+logger.offlinerequest.name = zimbra.offline.request
+logger.offlinerequest.level = debug
+
+logger.offlineresponse.name = zimbra.offline.response
+logger.offlineresponse.level = debug
+
+logger.webclinet.name = zimbra.webclient
+logger.webclinet.level = debug
+
+logger.dav.name = zimbra.dav
+logger.dav.level = debug
+
+rootLogger=INFO,CONSOLE,LOGFILE
+rootLogger.appenderRef.LOGFILE.ref = mailboxFile
diff --git a/store-conf/conf/log4j.properties.production b/store-conf/conf/log4j.properties.production
index 390bd0e5438..767a4b324f4 100644
--- a/store-conf/conf/log4j.properties.production
+++ b/store-conf/conf/log4j.properties.production
@@ -1,131 +1,213 @@
-# An example log4j configuration file that outputs to System.out. The
-# output information consists of relative time, log level, thread
-# name, logger name, nested diagnostic context and the message in that
-# order.
-
-# For the general syntax of property based configuration files see the
-# documenation of org.apache.log4j.PropertyConfigurator.
-
-log4j.threshhold=OFF
-
-%%uncomment VAR:!zimbraLogToSyslog%%log4j.rootLogger=INFO,LOGFILE
-%%uncomment VAR:zimbraLogToSyslog%%log4j.rootLogger=INFO,LOGFILE,SYSLOG
+status = error
+dest = err
+name = PropertiesConfig
+packages = com.zimbra
# Appender LOGFILE writes to the file "/opt/zimbra/log/mailbox.log".
# Daily rolling policy with compressing the old log file while rotating!!
# The archived log files location can be changed using FileNamePattern value
-log4j.appender.LOGFILE=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.LOGFILE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.LOGFILE.RollingPolicy.FileNamePattern=/opt/zimbra/log/mailbox.log.%d{yyyy-MM-dd}
-log4j.appender.LOGFILE.File=/opt/zimbra/log/mailbox.log
-log4j.appender.LOGFILE.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.LOGFILE.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+# Reference https://logging.apache.org/log4j/2.0/manual/configuration.html#ConfigurationSyntax
+
+appender.LOGFILE.type = RollingFile
+appender.LOGFILE.name = mailboxFile
+appender.LOGFILE.fileName = /opt/zimbra/log/mailbox.log
+appender.LOGFILE.filePattern = /opt/zimbra/log/mailbox.log.%d{yyyy-MM-dd}
+appender.LOGFILE.layout.type = PatternLayout
+appender.LOGFILE.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.LOGFILE.policies.type = Policies
+appender.LOGFILE.policies.time.type = TimeBasedTriggeringPolicy
+appender.LOGFILE.policies.time.interval = 2
+appender.LOGFILE.policies.time.modulate = true
+appender.LOGFILE.strategy.type = DefaultRolloverStrategy
+
# Appender AUDIT writes to the file "audit.log".
-log4j.appender.AUDIT=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.AUDIT.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.AUDIT.RollingPolicy.FileNamePattern=/opt/zimbra/log/audit.log.%d{yyyy-MM-dd}
-log4j.appender.AUDIT.File=/opt/zimbra/log/audit.log
-log4j.appender.AUDIT.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.AUDIT.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
-
-# Save zimbra.security to AUDIT appender
-log4j.additivity.zimbra.security=false
-log4j.logger.zimbra.security=INFO,AUDIT
-
-# Syslog appender
-log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
-log4j.appender.SYSLOG.SyslogHost=localhost
-log4j.appender.SYSLOG.Facility=LOCAL0
-log4j.appender.SYSLOG.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.SYSLOG.layout.ConversionPattern=mailboxd: %-5p [%t] [%z] %c{1} - %m
-
-# Logger service appender
-%%comment VAR:!zimbraLogHostname%%log4j.appender.SLOGGER=org.apache.log4j.net.SyslogAppender
-%%comment VAR:!zimbraLogHostname%%log4j.appender.SLOGGER.SyslogHost=%%zimbraLogHostname%%
-%%comment VAR:!zimbraLogHostname%%log4j.appender.SLOGGER.Facility=LOCAL1
-%%comment VAR:!zimbraLogHostname%%log4j.appender.SLOGGER.layout=com.zimbra.common.util.ZimbraPatternLayout
-%%comment VAR:!zimbraLogHostname%%log4j.appender.SLOGGER.layout.ConversionPattern=mailboxd: %-5p [%t] [%z] %c{1} - %m
+appender.AUDIT.type = RollingFile
+appender.AUDIT.name = auditFile
+appender.AUDIT.fileName = /opt/zimbra/log/audit.log
+appender.AUDIT.filePattern = /opt/zimbra/log/audit.log.%d{yyyy-MM-dd}
+appender.AUDIT.layout.type = PatternLayout
+appender.AUDIT.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.AUDIT.policies.type = Policies
+appender.AUDIT.policies.time.type = TimeBasedTriggeringPolicy
+appender.AUDIT.policies.time.interval = 2
+appender.AUDIT.policies.time.modulate = true
+appender.AUDIT.strategy.type = DefaultRolloverStrategy
# Appender SYNC writes to the file "sync.log".
-log4j.appender.SYNC=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.SYNC.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.SYNC.RollingPolicy.FileNamePattern=/opt/zimbra/log/sync.log.%d{yyyy-MM-dd}
-log4j.appender.SYNC.File=/opt/zimbra/log/sync.log
-log4j.appender.SYNC.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.SYNC.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.SYNC.type = RollingFile
+appender.SYNC.name = syncFile
+appender.SYNC.fileName = /opt/zimbra/log/sync.log
+appender.SYNC.filePattern = /opt/zimbra/log/sync.log.%d{yyyy-MM-dd}
+appender.SYNC.layout.type = PatternLayout
+appender.SYNC.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.SYNC.policies.type = Policies
+appender.SYNC.policies.time.type = TimeBasedTriggeringPolicy
+appender.SYNC.policies.time.interval = 2
+appender.SYNC.policies.time.modulate = true
+appender.SYNC.strategy.type = DefaultRolloverStrategy
# Appender SYNCTRACE writes to the file "synctrace.log".
-log4j.appender.SYNCTRACE=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.SYNCTRACE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.SYNCTRACE.RollingPolicy.FileNamePattern=/opt/zimbra/log/synctrace.log.%d{yyyy-MM-dd}
-log4j.appender.SYNCTRACE.File=/opt/zimbra/log/synctrace.log
-log4j.appender.SYNCTRACE.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.SYNCTRACE.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.SYNCTRACE.type = RollingFile
+appender.SYNCTRACE.name = syncTraceFile
+appender.SYNCTRACE.fileName = /opt/zimbra/log/synctrace.log
+appender.SYNCTRACE.filePattern = /opt/zimbra/log/synctrace.log.%d{yyyy-MM-dd}
+appender.SYNCTRACE.layout.type = PatternLayout
+appender.SYNCTRACE.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.SYNCTRACE.policies.type = Policies
+appender.SYNCTRACE.policies.time.type = TimeBasedTriggeringPolicy
+appender.SYNCTRACE.policies.time.interval = 2
+appender.SYNCTRACE.policies.time.modulate = true
+appender.SYNCTRACE.strategy.type = DefaultRolloverStrategy
# Appender SYNCSTATE writes to the file "syncstate.log".
-log4j.appender.SYNCSTATE=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.SYNCSTATE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.SYNCSTATE.RollingPolicy.FileNamePattern=/opt/zimbra/log/syncstate.log.%d{yyyy-MM-dd}
-log4j.appender.SYNCSTATE.File=/opt/zimbra/log/syncstate.log
-log4j.appender.SYNCSTATE.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.SYNCSTATE.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.SYNCSTATE.type = RollingFile
+appender.SYNCSTATE.name = syncStateFile
+appender.SYNCSTATE.fileName = /opt/zimbra/log/syncstate.log
+appender.SYNCSTATE.filePattern = /opt/zimbra/log/syncstate.log.%d{yyyy-MM-dd}
+appender.SYNCSTATE.layout.type = PatternLayout
+appender.SYNCSTATE.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.SYNCSTATE.policies.type = Policies
+appender.SYNCSTATE.policies.time.type = TimeBasedTriggeringPolicy
+appender.SYNCSTATE.policies.time.interval = 2
+appender.SYNCSTATE.policies.time.modulate = true
+appender.SYNCSTATE.strategy.type = DefaultRolloverStrategy
# Appender WBXML writes to the file "wbxml.log".
-log4j.appender.WBXML=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.WBXML.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.WBXML.RollingPolicy.FileNamePattern=/opt/zimbra/log/wbxml.log.%d{yyyy-MM-dd}
-log4j.appender.WBXML.File=/opt/zimbra/log/wbxml.log
-log4j.appender.WBXML.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.WBXML.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.WBXML.type = RollingFile
+appender.WBXML.name = wbXmlFile
+appender.WBXML.fileName = /opt/zimbra/log/wbxml.log
+appender.WBXML.filePattern = /opt/zimbra/log/wbxml.log.%d{yyyy-MM-dd}
+appender.WBXML.layout.type = PatternLayout
+appender.WBXML.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.WBXML.policies.type = Policies
+appender.WBXML.policies.time.type = TimeBasedTriggeringPolicy
+appender.WBXML.policies.time.interval = 2
+appender.WBXML.policies.time.modulate = true
+appender.WBXML.strategy.type = DefaultRolloverStrategy
# Appender ACTIVITY writes to the file "activity.log".
-log4j.appender.ACTIVITY=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.ACTIVITY.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.ACTIVITY.RollingPolicy.FileNamePattern=/opt/zimbra/log/activity.log.%d{yyyy-MM-dd}
-log4j.appender.ACTIVITY.File=/opt/zimbra/log/activity.log
-log4j.appender.ACTIVITY.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.ACTIVITY.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.ACTIVITY.type = RollingFile
+appender.ACTIVITY.name = activityFile
+appender.ACTIVITY.fileName = /opt/zimbra/log/activity.log
+appender.ACTIVITY.filePattern = /opt/zimbra/log/activity.log.%d{yyyy-MM-dd}
+appender.ACTIVITY.layout.type = PatternLayout
+appender.ACTIVITY.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.ACTIVITY.policies.type = Policies
+appender.ACTIVITY.policies.time.type = TimeBasedTriggeringPolicy
+appender.ACTIVITY.policies.time.interval = 2
+appender.ACTIVITY.policies.time.modulate = true
+appender.ACTIVITY.strategy.type = DefaultRolloverStrategy
# Appender SEARCHSTAT writes to the file "searchstat.log".
-log4j.appender.SEARCHSTAT=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.SEARCHSTAT.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.SEARCHSTAT.RollingPolicy.FileNamePattern=/opt/zimbra/log/searchstat.log.%d{yyyy-MM-dd}
-log4j.appender.SEARCHSTAT.File=/opt/zimbra/log/searchstat.log
-log4j.appender.SEARCHSTAT.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.SEARCHSTAT.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.SEARCHSTAT.type = RollingFile
+appender.SEARCHSTAT.name = searchStatFile
+appender.SEARCHSTAT.fileName = /opt/zimbra/log/searchstat.log
+appender.SEARCHSTAT.filePattern = /opt/zimbra/log/searchstat.log.%d{yyyy-MM-dd}
+appender.SEARCHSTAT.layout.type = PatternLayout
+appender.SEARCHSTAT.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.SEARCHSTAT.policies.type = Policies
+appender.SEARCHSTAT.policies.time.type = TimeBasedTriggeringPolicy
+appender.SEARCHSTAT.policies.time.interval = 2
+appender.SEARCHSTAT.policies.time.modulate = true
+appender.SEARCHSTAT.strategy.type = DefaultRolloverStrategy
# Appender EWS writes to the file "ews.log".
-log4j.appender.EWS=org.apache.log4j.rolling.RollingFileAppender
-log4j.appender.EWS.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
-log4j.appender.EWS.RollingPolicy.FileNamePattern=/opt/zimbra/log/ews.log.%d{yyyy-MM-dd}
-log4j.appender.EWS.File=/opt/zimbra/log/ews.log
-log4j.appender.EWS.layout=com.zimbra.common.util.ZimbraPatternLayout
-log4j.appender.EWS.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n
+appender.EWS.type = RollingFile
+appender.EWS.name = ewsFile
+appender.EWS.fileName = /opt/zimbra/log/ews.log
+appender.EWS.filePattern = /opt/zimbra/log/ews.log.%d{yyyy-MM-dd}
+appender.EWS.layout.type = PatternLayout
+appender.EWS.layout.pattern = %d %-5p [%t] [%z] %c{1} - %m%n
+appender.EWS.policies.type = Policies
+appender.EWS.policies.time.type = TimeBasedTriggeringPolicy
+appender.EWS.policies.time.interval = 2
+appender.EWS.policies.time.modulate = true
+appender.EWS.strategy.type = DefaultRolloverStrategy
+
+# Syslog appender
+appender.SYSLOG.type = Syslog
+appender.SYSLOG.name = syslogAppender
+appender.SYSLOG.host = localhost
+appender.SYSLOG.facility = LOCAL0
+appender.SYSLOG.layout.type = PatternLayout
+appender.SYSLOG.layout.pattern = mailboxd: %-5p [%t] [%z] %c{1} - %m
+
+# Logger service appender
+%%comment VAR:!zimbraLogHostname%%appender.SLOGGER.type = Syslog
+%%comment VAR:!zimbraLogHostname%%appender.SLOGGER.name = sloggerAppender
+%%comment VAR:!zimbraLogHostname%%appender.SLOGGER.host = %%zimbraLogHostname%%
+%%comment VAR:!zimbraLogHostname%%appender.SLOGGER.facility = LOCAL1
+%%comment VAR:!zimbraLogHostname%%appender.SLOGGER.layout.type = PatternLayout
+%%comment VAR:!zimbraLogHostname%%appender.SLOGGER.layout.pattern = mailboxd: %-5p [%t] [%z] %c{1} - %m
+
+logger.zimbra.name = zimbra.mailbox
+logger.zimbra.level = info
+logger.zimbra.additivity = false
+logger.zimbra.appenderRef.LOGFILE.ref = mailboxFile
+
+# Save zimbra.security to AUDIT appender
+logger.security.name = zimbra.security
+logger.security.level = debug, AUDIT
+logger.security.additivity = false
+logger.security.appenderRef.AUDIT.ref = auditFile
+
+logger.sync.name = zimbra.sync
+logger.sync.level = info,SYNC
+logger.sync.additivity = false
+logger.sync.appenderRef.SYNC.ref = syncFile
+
+logger.synctrace.name = zimbra.synctrace
+logger.synctrace.level = info,SYNCTRACE
+logger.synctrace.additivity = false
+logger.synctrace.appenderRef.SYNCTRACE.ref = syncTraceFile
+
+logger.syncstate.name = zimbra.syncstate
+logger.syncstate.level = info,SYNCSTATE
+logger.syncstate.additivity = false
+logger.syncstate.appenderRef.SYNCSTATE.ref = syncStateFile
+
+logger.wbxml.name = zimbra.wbxml
+logger.wbxml.level = info,WBXML
+logger.wbxml.additivity = false
+logger.wbxml.appenderRef.WBXML.ref = wbXmlFile
+
+logger.activity.name = zimbra.activity
+logger.activity.level = info,ACTIVITY
+logger.activity.additivity = false
+logger.activity.appenderRef.ACTIVITY.ref = activityFile
+
+logger.searchstat.name = zimbra.searchstat
+logger.searchstat.level = info,SEARCHSTAT
+logger.searchstat.additivity = false
+logger.searchstat.appenderRef.SEARCHSTAT.ref = searchStatFile
+
+logger.ews.name = zimbra.ews
+logger.ews.level = info,EWS
+logger.ews.additivity = false
+logger.ews.appenderRef.EWS.ref = ewsFile
+
+logger.syslog.name = com.zimbra
+logger.syslog.level = debug
+logger.syslog.additivity = false
+logger.syslog.appenderRef.SYSLOG.ref = syslogAppender
# HttpMethodBase spews out too many WARN on the badly formatted cookies.
-log4j.logger.org.apache.commons.httpclient.HttpMethodBase=ERROR
+#logger.org.apache.commons.httpclient.HttpMethodBase=ERROR
+logger.httpmethodbase.name = org.apache.commons.httpclient.HttpMethodBase
+logger.httpmethodbase.level = ERROR
# spymemcached is too verbose at INFO level.
-log4j.logger.net.spy.memcached=WARN
-
-log4j.additivity.zimbra.sync=false
-log4j.logger.zimbra.sync=INFO,SYNC
-log4j.additivity.zimbra.synctrace=false
-log4j.logger.zimbra.synctrace=INFO,SYNCTRACE
-log4j.additivity.zimbra.syncstate=false
-log4j.logger.zimbra.syncstate=INFO,SYNCSTATE
-log4j.additivity.zimbra.wbxml=false
-log4j.logger.zimbra.wbxml=INFO,WBXML
-log4j.additivity.zimbra.activity=false
-log4j.logger.zimbra.activity=INFO,ACTIVITY
-log4j.logger.zimbra.searchstat=INFO,SEARCHSTAT
-log4j.additivity.zimbra.ews=false
-log4j.logger.zimbra.ews=INFO,EWS
-
-log4j.logger.zimbra=INFO
-log4j.logger.zimbra.op=WARN
-log4j.logger.com.zimbra=INFO
-log4j.additivity.zimbra.slogger=FALSE
-%%comment VAR:!zimbraLogHostname%%log4j.logger.zimbra.slogger=INFO,SLOGGER
-%%uncomment VAR:!zimbraLogHostname%%log4j.logger.zimbra.slogger=ERROR
+#logger.net.spy.memcached=WARN
+logger.memcached.name = net.spy.memcached
+logger.memcached.level = WARN
+
+%%comment VAR:!zimbraLogHostname%%logger.slogger.name = zimbra.slogger
+%%comment VAR:!zimbraLogHostname%%logger.slogger.level=INFO,SLOGGER
+%%uncomment VAR:!zimbraLogHostname%%logger.slogger.level=ERROR
+%%comment VAR:!zimbraLogHostname%%logger.slogger.additivity = false
+%%comment VAR:!zimbraLogHostname%%logger.slogger.appenderRef.SLOGGER.ref = sloggerAppender
+
+rootLogger.level=INFO
+
+rootLogger.appenderRef.LOGFILE.ref = mailboxFile
diff --git a/store/build.xml b/store/build.xml
index f9a10532ab6..fdf84d64cd5 100644
--- a/store/build.xml
+++ b/store/build.xml
@@ -270,14 +270,14 @@
-
-
+
+
-
+
diff --git a/store/ivy.xml b/store/ivy.xml
index 4faa011fe43..9292dd7136b 100644
--- a/store/ivy.xml
+++ b/store/ivy.xml
@@ -15,13 +15,14 @@
-
-
+
+
-
+
+
@@ -70,7 +71,7 @@
-
+
diff --git a/store/src/java/com/zimbra/cs/ephemeral/EphemeralStore.java b/store/src/java/com/zimbra/cs/ephemeral/EphemeralStore.java
index f575ee7c9cc..80bd17e4fab 100644
--- a/store/src/java/com/zimbra/cs/ephemeral/EphemeralStore.java
+++ b/store/src/java/com/zimbra/cs/ephemeral/EphemeralStore.java
@@ -370,7 +370,7 @@ private static void usage() {
public static class EphemeralStoreMatcher implements ExtensionUtil.ExtensionMatcher {
private final String storeId;
public EphemeralStoreMatcher(String storeId) {
- this.storeId = storeId;
+ this.storeId = storeId;
}
@Override
public boolean matches(ZimbraExtension ext) {
diff --git a/store/src/java/com/zimbra/cs/imap/ImapDaemon.java b/store/src/java/com/zimbra/cs/imap/ImapDaemon.java
index a13fd3d11ab..c8cd260d714 100644
--- a/store/src/java/com/zimbra/cs/imap/ImapDaemon.java
+++ b/store/src/java/com/zimbra/cs/imap/ImapDaemon.java
@@ -23,7 +23,8 @@
import java.util.Properties;
import com.zimbra.cs.extension.ExtensionUtil;
-import org.apache.log4j.PropertyConfigurator;
+import org.apache.logging.log4j.core.config.ConfigurationSource;
+import org.apache.logging.log4j.core.config.Configurator;
import com.zimbra.common.calendar.WellKnownTimeZones;
import com.zimbra.common.localconfig.LC;
@@ -94,11 +95,12 @@ private void stopServers() {
public static void main(String[] args) {
try {
- Properties props = new Properties();
- try (FileInputStream fisLog4j = new FileInputStream(IMAPD_LOG4J_CONFIG)) {
- props.load(fisLog4j);
- }
- PropertyConfigurator.configure(props);
+ try {
+ ConfigurationSource logConfigSource = new ConfigurationSource(new FileInputStream(IMAPD_LOG4J_CONFIG));
+ Configurator.initialize(null, logConfigSource);
+ } catch (IOException e) {
+ ZimbraLog.misc.info("Error initializing the loggers.", e);
+ }
String imapdClassStore=LC.imapd_class_store.value();
try {
StoreManager.getInstance(imapdClassStore).startup();
@@ -106,7 +108,7 @@ public static void main(String[] args) {
throw ServiceException.FAILURE(String.format("Unable to initialize StoreManager: %s", imapdClassStore), e);
}
- if(isZimbraImapEnabled()) {
+ if(isZimbraImapEnabled()) {
ZimbraPerf.prepare(ZimbraPerf.ServerID.IMAP_DAEMON);
MemoryStats.startup();
ZimbraPerf.initialize(ZimbraPerf.ServerID.IMAP_DAEMON);
diff --git a/store/src/java/com/zimbra/cs/index/IndexEditor.java b/store/src/java/com/zimbra/cs/index/IndexEditor.java
index 4609b8c07c9..a61c5400bd6 100644
--- a/store/src/java/com/zimbra/cs/index/IndexEditor.java
+++ b/store/src/java/com/zimbra/cs/index/IndexEditor.java
@@ -23,6 +23,7 @@
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
+import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
@@ -33,11 +34,16 @@
import java.util.List;
import java.util.Set;
-import org.apache.log4j.Layout;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.log4j.PatternLayout;
-import org.apache.log4j.WriterAppender;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.WriterAppender;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Configurator;
+import org.apache.logging.log4j.core.config.LoggerConfig;
+import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
@@ -437,22 +443,27 @@ protected boolean authenticate() throws IOException {
public boolean enableLogging() {
if (mAppender == null) {
- Layout layout = new PatternLayout(logLayoutPattern );
- mAppender = new WriterAppender(layout, mOutputStream);
- Logger root = Logger.getRootLogger();
+ Layout layout = PatternLayout.newBuilder().withPattern(logLayoutPattern).build();
+ mAppender = WriterAppender.newBuilder().setTarget(new OutputStreamWriter(mOutputStream))
+ .setLayout(layout).build();
- root.addAppender(mAppender);
+ Logger root = LogManager.getRootLogger();
+ LoggerContext context = LoggerContext.getContext(false);
+ Configuration configuration = context.getConfiguration();
+ LoggerConfig loggerConfig = configuration.getLoggerConfig(root.getName());
+
+ loggerConfig.addAppender(mAppender, Level.INFO, null);
return true;
} else {
- return false;
+ return false;
}
}
public boolean disableLogging() {
if (mAppender != null) {
- Logger root = Logger.getRootLogger();
- root.removeAppender(mAppender);
- mAppender = null;
+ final LoggerContext context = LoggerContext.getContext(false);
+ final Configuration config = context.getConfiguration();
+ config.getRootLogger().removeAppender(mAppender.getName());
return true;
}
return false;
@@ -678,7 +689,7 @@ public void logLevel()
outputStream.print("Caught exception: "+e.toString());
}
- Logger root = Logger.getRootLogger();
+ Logger root = LoggerContext.getContext().getRootLogger();
if (logLevel != null && !logLevel.equals("")) {
@@ -705,7 +716,7 @@ public void logLevel()
return;
}
- root.setLevel(newLevel);
+ Configurator.setLevel(root.getName(), newLevel);
}
Level cur = root.getLevel();
outputStream.println("Current level is: "+cur);
diff --git a/store/src/java/com/zimbra/cs/mailclient/MailClient.java b/store/src/java/com/zimbra/cs/mailclient/MailClient.java
index 4df01bef02c..39e64dd2b30 100644
--- a/store/src/java/com/zimbra/cs/mailclient/MailClient.java
+++ b/store/src/java/com/zimbra/cs/mailclient/MailClient.java
@@ -29,6 +29,12 @@
import com.zimbra.cs.mailclient.pop3.Pop3Connection;
import javax.security.sasl.Sasl;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.config.Configurator;
+
import javax.security.auth.login.LoginException;
import java.io.Console;
@@ -41,25 +47,23 @@
import java.util.Map;
import java.util.HashMap;
-import org.apache.log4j.BasicConfigurator;
-import org.apache.log4j.Logger;
-import org.apache.log4j.Level;
-
public abstract class MailClient {
private final MailConfig config;
protected MailConnection connection;
private final StringBuilder sbuf = new StringBuilder(132);
private String password;
private boolean eof;
+
+ private static final Logger LOG = LogManager.getLogger(MailClient.class);
protected MailClient(MailConfig config) {
this.config = config;
}
public void run(String[] args) throws LoginException, IOException {
- BasicConfigurator.configure();
- Logger.getRootLogger().setLevel(Level.INFO);
- config.getLogger().setLevel(Log.Level.trace);
+ Configurator.reconfigure();
+ Configurator.setRootLevel(Level.INFO);
+ Configurator.setLevel(LOG.getName(), Level.INFO);
parseArguments(args, config);
connect();
authenticate();
diff --git a/store/src/java/com/zimbra/cs/redolog/util/PlaybackUtil.java b/store/src/java/com/zimbra/cs/redolog/util/PlaybackUtil.java
index e3640b10e2b..ade67f5fe8e 100644
--- a/store/src/java/com/zimbra/cs/redolog/util/PlaybackUtil.java
+++ b/store/src/java/com/zimbra/cs/redolog/util/PlaybackUtil.java
@@ -37,9 +37,13 @@
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
-import org.apache.log4j.Appender;
-import org.apache.log4j.ConsoleAppender;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.Logger;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.ConsoleAppender;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.LoggerConfig;
import com.zimbra.common.localconfig.LC;
import com.zimbra.common.service.ServiceException;
@@ -378,17 +382,21 @@ private static void setup() throws ServiceException {
// set up log4j
ZimbraLog.toolSetupLog4j("INFO", LC.zimbra_log4j_properties.value());
// remove the console appender if any
- Logger rootLogger = Logger.getRootLogger();
+ org.apache.logging.log4j.Logger rootLogger = LogManager.getRootLogger();
Appender consoleAppender = null;
- Enumeration appenders = rootLogger.getAllAppenders();
- while (appenders.hasMoreElements()) {
- Appender appender = (Appender) appenders.nextElement();
+ LoggerContext context = LoggerContext.getContext(false);
+ Configuration configuration = context.getConfiguration();
+ LoggerConfig loggerConfig = configuration.getLoggerConfig(rootLogger.getName());
+ Map appenders = loggerConfig.getAppenders();
+
+ while (appenders.values().iterator().hasNext()) {
+ Appender appender = appenders.values().iterator().next();
if (appender instanceof ConsoleAppender) {
consoleAppender = appender;
}
}
if (consoleAppender != null)
- rootLogger.removeAppender(consoleAppender);
+ loggerConfig.removeAppender(consoleAppender.getName());
DbPool.startup();
Zimbra.startupCLI();
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/com/zimbra/cs/util/yauth/AuthTest.java b/store/src/java/com/zimbra/cs/util/yauth/AuthTest.java
index 77097660680..5bed9b09622 100644
--- a/store/src/java/com/zimbra/cs/util/yauth/AuthTest.java
+++ b/store/src/java/com/zimbra/cs/util/yauth/AuthTest.java
@@ -16,10 +16,11 @@
*/
package com.zimbra.cs.util.yauth;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.config.Configurator;
+
import junit.framework.TestCase;
-import org.apache.log4j.Logger;
-import org.apache.log4j.BasicConfigurator;
-import org.apache.log4j.Level;
+
public class AuthTest extends TestCase {
private static final String APPID = "D2hTUBHAkY0IEL5MA7ibTS_1K86E8RErSSaTGn4-";
@@ -29,8 +30,8 @@ public class AuthTest extends TestCase {
private static String token;
static {
- BasicConfigurator.configure();
- Logger.getRootLogger().setLevel(Level.DEBUG);
+ Configurator.reconfigure();
+ Configurator.setRootLevel(Level.DEBUG);
}
private static String getToken() throws Exception {
diff --git a/store/src/java/com/zimbra/cs/util/yauth/FileTokenStore.java b/store/src/java/com/zimbra/cs/util/yauth/FileTokenStore.java
index 8a33e06afbb..b3dabd59eb1 100644
--- a/store/src/java/com/zimbra/cs/util/yauth/FileTokenStore.java
+++ b/store/src/java/com/zimbra/cs/util/yauth/FileTokenStore.java
@@ -16,7 +16,6 @@
*/
package com.zimbra.cs.util.yauth;
-import org.apache.log4j.Logger;
import java.io.File;
import java.io.IOException;
@@ -28,13 +27,17 @@
import java.io.FileNotFoundException;
import java.io.BufferedReader;
import java.util.Map;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
import java.util.HashMap;
public class FileTokenStore extends TokenStore {
private final File file;
private final Map tokens;
- private static final Logger LOG = Logger.getLogger(FileTokenStore.class);
+ private static final Logger LOG = LogManager.getLogger(FileTokenStore.class);
public FileTokenStore(File file) throws IOException {
this.file = file;
diff --git a/store/src/java/com/zimbra/cs/util/yauth/RawAuth.java b/store/src/java/com/zimbra/cs/util/yauth/RawAuth.java
index dddc7193ce3..825cd74ab23 100644
--- a/store/src/java/com/zimbra/cs/util/yauth/RawAuth.java
+++ b/store/src/java/com/zimbra/cs/util/yauth/RawAuth.java
@@ -31,8 +31,10 @@
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.core.Logger;
+import org.apache.logging.log4j.core.config.Configurator;
import com.zimbra.common.httpclient.HttpClientUtil;
import com.zimbra.common.localconfig.LC;
@@ -49,13 +51,14 @@ public class RawAuth implements Auth {
private String wssId;
private long expiration;
- private static final Logger LOG = Logger.getLogger(RawAuth.class);
+ private static final org.apache.logging.log4j.Logger LOG = LogManager.getLogger(RawAuth.class);
private static final boolean DEBUG = false;
static {
if (DEBUG) {
- LOG.setLevel(Level.DEBUG);
+ Configurator.reconfigure();
+ Configurator.setLevel(LOG.getName(), Level.DEBUG);
System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog");
System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire.header", "debug");
diff --git a/store/src/java/com/zimbra/cs/util/yauth/RawAuthManager.java b/store/src/java/com/zimbra/cs/util/yauth/RawAuthManager.java
index dab8edd433e..800dac90e8a 100644
--- a/store/src/java/com/zimbra/cs/util/yauth/RawAuthManager.java
+++ b/store/src/java/com/zimbra/cs/util/yauth/RawAuthManager.java
@@ -16,16 +16,18 @@
*/
package com.zimbra.cs.util.yauth;
-import org.apache.log4j.Logger;
import java.io.IOException;
import java.util.HashMap;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
public final class RawAuthManager {
private final TokenStore store;
private final HashMap cookies;
- private static final Logger LOG = Logger.getLogger(RawAuthManager.class);
+ private static final Logger LOG = LogManager.getLogger(RawAuthManager.class);
public RawAuthManager(TokenStore store) {
this.store = store;
@@ -72,9 +74,12 @@ public Authenticator newAuthenticator(final String appId,
final String user,
final String pass) {
return new Authenticator() {
+ @Override
public RawAuth authenticate() throws AuthenticationException, IOException {
return RawAuthManager.this.authenticate(appId, user, pass);
}
+
+ @Override
public void invalidate() {
RawAuthManager.this.invalidate(appId, user);
}
@@ -89,6 +94,7 @@ private String key(String appId, String user) {
return appId + " " + user;
}
+ @Override
public String toString() {
return String.format("{cookies=%d,tokens=%d}", cookies.size(), store.size());
}
diff --git a/store/src/java/com/zimbra/qa/unittest/TestImapClient.java b/store/src/java/com/zimbra/qa/unittest/TestImapClient.java
index c8596314064..0db924102a2 100644
--- a/store/src/java/com/zimbra/qa/unittest/TestImapClient.java
+++ b/store/src/java/com/zimbra/qa/unittest/TestImapClient.java
@@ -41,9 +41,10 @@
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
-import org.apache.log4j.BasicConfigurator;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.config.Configurator;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
@@ -92,7 +93,7 @@ public class TestImapClient {
private ImapConfig config;
private ImapConnection connection;
- private static final Logger LOG = Logger.getLogger(TestImapClient.class);
+ private static final Logger LOG = LogManager.getLogger(TestImapClient.class);
private static final String USER = "TestImapClient-user1";
private static final String PASS = "test123";
@@ -116,9 +117,9 @@ public class TestImapClient {
@BeforeClass
public static void beforeClass() throws Exception {
- BasicConfigurator.configure();
- Logger.getRootLogger().setLevel(Level.INFO);
- LOG.setLevel(Level.DEBUG);
+ Configurator.reconfigure();
+ Configurator.setRootLevel(Level.INFO);
+ Configurator.setLevel(LOG.getName(), Level.DEBUG);
sp = new SoapProvisioning();
prov = Provisioning.getInstance();
homeServer = prov.getLocalServer();
@@ -383,7 +384,7 @@ public void testID() throws Exception {
@Ignore ("deprecated")
public void testYahoo() throws Exception {
ImapConfig config = new ImapConfig();
- config.getLogger().setLevel(Log.Level.trace);
+ config.getLogger().setLevel(Log.Level.trace);
config.setHost("imap.mail.yahoo.com");
config.setAuthenticationId("dacztest");
connection = new ImapConnection(config);
diff --git a/store/src/java/com/zimbra/qa/unittest/TestPop3Client.java b/store/src/java/com/zimbra/qa/unittest/TestPop3Client.java
index 1fe54bfdfb5..e14765b8f4f 100644
--- a/store/src/java/com/zimbra/qa/unittest/TestPop3Client.java
+++ b/store/src/java/com/zimbra/qa/unittest/TestPop3Client.java
@@ -19,9 +19,10 @@
import java.io.IOException;
import java.io.InputStream;
+import org.apache.logging.log4j.core.config.Configurator;
+
import junit.framework.TestCase;
-import org.apache.log4j.BasicConfigurator;
import com.zimbra.common.util.Log;
import com.zimbra.cs.mailclient.pop3.Pop3Capabilities;
@@ -41,7 +42,7 @@ public class TestPop3Client extends TestCase {
private static final String PASS = "test123";
static {
- BasicConfigurator.configure();
+ Configurator.reconfigure();
}
public void testDown() throws Exception {
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();
+ }
+
}