Repository: ignite
Updated Branches:
  refs/heads/master 5f23f85a6 -> 6ab2cc38d


IGNITE-7284: Introduce DEV_ONLY marker to IgniteLogger. Fixes #3346.

Signed-off-by: Valentin Kulichenko <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/edc5a5f3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/edc5a5f3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/edc5a5f3

Branch: refs/heads/master
Commit: edc5a5f3cb79104b65dd0d95db10d70ab7da24db
Parents: 5f23f85
Author: Stanislav Lukyanov <[email protected]>
Authored: Thu Jan 18 17:29:46 2018 -0800
Committer: Valentin Kulichenko <[email protected]>
Committed: Thu Jan 18 17:29:46 2018 -0800

----------------------------------------------------------------------
 config/ignite-log4j2.xml                        |   6 +-
 .../java/org/apache/ignite/IgniteLogger.java    | 102 ++++++++++++++---
 .../apache/ignite/IgniteSystemProperties.java   |   5 +
 .../apache/ignite/internal/GridLoggerProxy.java |  25 +++++
 .../internal/binary/BinaryClassDescriptor.java  |   2 +-
 .../processors/query/GridQueryProcessor.java    |   4 +-
 .../ignite/internal/util/IgniteUtils.java       |  24 ++++
 modules/core/src/test/config/log4j2-test.xml    |   6 +-
 .../src/test/config/log4j2-verbose-test.xml     |   4 +-
 .../internal/util/IgniteDevOnlyLogTest.java     | 105 ++++++++++++++++++
 modules/log4j2/pom.xml                          |   4 +-
 .../ignite/logger/log4j2/Log4J2Logger.java      |  45 ++++++--
 .../log4j2/src/test/config/log4j2-markers.xml   |  38 +++++++
 .../logger/log4j2/Log4j2LoggerMarkerTest.java   | 110 +++++++++++++++++++
 .../testsuites/IgniteLog4j2TestSuite.java       |   6 +-
 modules/slf4j/pom.xml                           |  22 ++++
 .../apache/ignite/logger/slf4j/Slf4jLogger.java |  44 ++++++--
 .../logger/slf4j/Slf4jLoggerMarkerTest.java     | 108 ++++++++++++++++++
 .../ignite/testsuites/IgniteSlf4jTestSuite.java |  37 +++++++
 .../slf4j/src/test/resources/log4j2-test.xml    |  38 +++++++
 parent/pom.xml                                  |   1 +
 21 files changed, 684 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/config/ignite-log4j2.xml
----------------------------------------------------------------------
diff --git a/config/ignite-log4j2.xml b/config/ignite-log4j2.xml
index 2c88e57..7154ae8 100644
--- a/config/ignite-log4j2.xml
+++ b/config/ignite-log4j2.xml
@@ -20,12 +20,12 @@
 <Configuration>
     <Appenders>
         <Console name="CONSOLE" target="SYSTEM_OUT">
-            <PatternLayout pattern="[%d{ISO8601}][%-5p][%t][%c{1}] %m%n"/>
+            <PatternLayout 
pattern="[%d{ISO8601}][%-5p][%t][%c{1}]%notEmpty{[%markerSimpleName]} %m%n"/>
             <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="ACCEPT"/>
         </Console>
 
         <Console name="CONSOLE_ERR" target="SYSTEM_ERR">
-            <PatternLayout pattern="[%d{ISO8601}][%-5p][%t][%c{1}] %m%n"/>
+            <PatternLayout 
pattern="[%d{ISO8601}][%-5p][%t][%c{1}]%notEmpty{[%markerSimpleName]} %m%n"/>
         </Console>
 
         <Routing name="FILE">
@@ -33,7 +33,7 @@
                 <Route>
                     <RollingFile name="Rolling-${sys:nodeId}" 
fileName="${sys:IGNITE_HOME}/work/log/ignite-${sys:nodeId}.log"
                                  
filePattern="${sys:IGNITE_HOME}/work/log/ignite-${sys:nodeId}-%i-%d{yyyy-MM-dd}.log.gz">
-                        <PatternLayout pattern="[%d{ISO8601}][%-5p][%t][%c{1}] 
%m%n"/>
+                        <PatternLayout 
pattern="[%d{ISO8601}][%-5p][%t][%c{1}]%notEmpty{[%markerSimpleName]} %m%n"/>
                         <Policies>
                             <TimeBasedTriggeringPolicy interval="6" 
modulate="true" />
                             <SizeBasedTriggeringPolicy size="10 MB" />

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/core/src/main/java/org/apache/ignite/IgniteLogger.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteLogger.java 
b/modules/core/src/main/java/org/apache/ignite/IgniteLogger.java
index b1433a8..0f5e4aa 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteLogger.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteLogger.java
@@ -66,96 +66,172 @@ import org.jetbrains.annotations.Nullable;
 @GridToStringExclude
 public interface IgniteLogger {
     /**
+     * Marker for log messages that are useful in development environments, 
but not in production.
+     */
+    String DEV_ONLY = "DEV_ONLY";
+
+    /**
      * Creates new logger with given category based off the current instance.
      *
      * @param ctgr Category for new logger.
      * @return New logger with given category.
      */
-    public IgniteLogger getLogger(Object ctgr);
+    IgniteLogger getLogger(Object ctgr);
+
+    /**
+     * Logs out trace message.
+     *
+     * @param msg Trace message.
+     */
+    void trace(String msg);
 
     /**
      * Logs out trace message.
      *
+     * @implSpec
+     * The default implementation calls {@code this.trace(msg)}.
+     *
+     * @param marker Name of the marker to be associated with the message.
      * @param msg Trace message.
      */
-    public void trace(String msg);
+    default void trace(@Nullable String marker, String msg) {
+        trace(msg);
+    }
 
     /**
      * Logs out debug message.
      *
      * @param msg Debug message.
      */
-    public void debug(String msg);
+    void debug(String msg);
+
+    /**
+     * Logs out debug message.
+     *
+     * @implSpec
+     * The default implementation calls {@code this.debug(msg)}.
+     *
+     * @param marker Name of the marker to be associated with the message.
+     * @param msg Debug message.
+     */
+    default void debug(@Nullable String marker, String msg) {
+        debug(msg);
+    }
+
+    /**
+     * Logs out information message.
+     *
+     * @param msg Information message.
+     */
+    void info(String msg);
 
     /**
      * Logs out information message.
      *
+     * @implSpec
+     * The default implementation calls {@code this.info(msg)}.
+     *
+     * @param marker Name of the marker to be associated with the message.
      * @param msg Information message.
      */
-    public void info(String msg);
+    default void info(@Nullable String marker, String msg) {
+        info(msg);
+    }
 
     /**
      * Logs out warning message.
      *
      * @param msg Warning message.
      */
-    public void warning(String msg);
+    default void warning(String msg) {
+        warning(msg, null);
+    }
+
+    /**
+     * Logs out warning message with optional exception.
+     *
+     * @param msg Warning message.
+     * @param e Optional exception (can be {@code null}).
+     */
+    void warning(String msg, @Nullable Throwable e);
 
     /**
      * Logs out warning message with optional exception.
      *
+     * @implSpec
+     * The default implementation calls {@code this.warning(msg)}.
+     *
+     * @param marker Name of the marker to be associated with the message.
      * @param msg Warning message.
      * @param e Optional exception (can be {@code null}).
      */
-    public void warning(String msg, @Nullable Throwable e);
+    default void warning(@Nullable String marker, String msg, @Nullable 
Throwable e) {
+        warning(msg, e);
+    }
 
     /**
      * Logs out error message.
      *
      * @param msg Error message.
      */
-    public void error(String msg);
+    default void error(String msg) {
+        error(null, msg, null);
+    }
+
+    /**
+     * Logs error message with optional exception.
+     *
+     * @param msg Error message.
+     * @param e Optional exception (can be {@code null}).
+     */
+    void error(String msg, @Nullable Throwable e);
 
     /**
      * Logs error message with optional exception.
      *
+     * @implSpec
+     * The default implementation calls {@code this.error(msg)}.
+     *
+     * @param marker Name of the marker to be associated with the message.
      * @param msg Error message.
      * @param e Optional exception (can be {@code null}).
      */
-    public void error(String msg, @Nullable Throwable e);
+    default void error(@Nullable String marker, String msg, @Nullable 
Throwable e) {
+        error(msg, e);
+    }
 
     /**
      * Tests whether {@code trace} level is enabled.
      *
      * @return {@code true} in case when {@code trace} level is enabled, 
{@code false} otherwise.
      */
-    public boolean isTraceEnabled();
+    boolean isTraceEnabled();
 
     /**
      * Tests whether {@code debug} level is enabled.
      *
      * @return {@code true} in case when {@code debug} level is enabled, 
{@code false} otherwise.
      */
-    public boolean isDebugEnabled();
+    boolean isDebugEnabled();
 
     /**
      * Tests whether {@code info} level is enabled.
      *
      * @return {@code true} in case when {@code info} level is enabled, {@code 
false} otherwise.
      */
-    public boolean isInfoEnabled();
+    boolean isInfoEnabled();
 
     /**
      * Tests whether Logger is in "Quiet mode".
      *
      * @return {@code true} "Quiet mode" is enabled, {@code false} otherwise
      */
-    public boolean isQuiet();
+    boolean isQuiet();
 
     /**
      * Gets name of the file being logged to if one is configured or {@code 
null} otherwise.
      *
      * @return Name of the file being logged to if one is configured or {@code 
null} otherwise.
      */
-    public String fileName();
+    String fileName();
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java 
b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
index 833773a..9cd031d 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -816,6 +816,11 @@ public final class IgniteSystemProperties {
      */
     public static final String IGNITE_DIRECT_IO_ENABLED = 
"IGNITE_DIRECT_IO_ENABLED";
 
+    /**
+     * When set to {@code true}, warnings that are intended for development 
environments and not for production
+     * (such as coding mistakes in code using Ignite) will not be logged.
+     */
+    public static final String IGNITE_DEV_ONLY_LOGGING_DISABLED = 
"IGNITE_DEV_ONLY_LOGGING_DISABLED";
 
     /**
      * Enforces singleton.

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/core/src/main/java/org/apache/ignite/internal/GridLoggerProxy.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/GridLoggerProxy.java 
b/modules/core/src/main/java/org/apache/ignite/internal/GridLoggerProxy.java
index fc49b96..4b3befc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridLoggerProxy.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridLoggerProxy.java
@@ -119,16 +119,31 @@ public class GridLoggerProxy implements IgniteLogger, 
LifecycleAware, Externaliz
     }
 
     /** {@inheritDoc} */
+    @Override public void trace(@Nullable String marker, String msg) {
+        impl.trace(marker, enrich(msg));
+    }
+
+    /** {@inheritDoc} */
     @Override public void debug(String msg) {
         impl.debug(enrich(msg));
     }
 
     /** {@inheritDoc} */
+    @Override public void debug(@Nullable String marker, String msg) {
+        impl.debug(marker, enrich(msg));
+    }
+
+    /** {@inheritDoc} */
     @Override public void info(String msg) {
         impl.info(enrich(msg));
     }
 
     /** {@inheritDoc} */
+    @Override public void info(@Nullable String marker, String msg) {
+        impl.info(marker, enrich(msg));
+    }
+
+    /** {@inheritDoc} */
     @Override public void warning(String msg) {
         impl.warning(enrich(msg));
     }
@@ -139,6 +154,11 @@ public class GridLoggerProxy implements IgniteLogger, 
LifecycleAware, Externaliz
     }
 
     /** {@inheritDoc} */
+    @Override public void warning(@Nullable String marker, String msg, 
@Nullable Throwable e) {
+        impl.warning(marker, enrich(msg), e);
+    }
+
+    /** {@inheritDoc} */
     @Override public void error(String msg) {
         impl.error(enrich(msg));
     }
@@ -149,6 +169,11 @@ public class GridLoggerProxy implements IgniteLogger, 
LifecycleAware, Externaliz
     }
 
     /** {@inheritDoc} */
+    @Override public void error(@Nullable String marker, String msg, @Nullable 
Throwable e) {
+        impl.error(marker, enrich(msg), e);
+    }
+
+    /** {@inheritDoc} */
     @Override public boolean isTraceEnabled() {
         return impl.isTraceEnabled();
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
index 2056566..3e75982 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
@@ -188,7 +188,7 @@ public class BinaryClassDescriptor {
         }
 
         if (useOptMarshaller && userType && !U.isIgnite(cls) && !U.isJdk(cls) 
&& !QueryUtils.isGeometryClass(cls)) {
-            U.warn(ctx.log(), "Class \"" + cls.getName() + "\" cannot be 
serialized using " +
+            U.warnDevOnly(ctx.log(), "Class \"" + cls.getName() + "\" cannot 
be serialized using " +
                 BinaryMarshaller.class.getSimpleName() + " because it either 
implements Externalizable interface " +
                 "or have writeObject/readObject methods. " + 
OptimizedMarshaller.class.getSimpleName() + " will be " +
                 "used instead and class instances will be deserialized on the 
server. Please ensure that all nodes " +

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
index 3bbe8f1..165e450 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
@@ -64,9 +64,7 @@ import 
org.apache.ignite.internal.processors.cache.CacheObjectContext;
 import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor;
 import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
-import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
-import org.apache.ignite.internal.processors.cache.StoredCacheData;
 import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
 import org.apache.ignite.internal.processors.cache.query.CacheQueryFuture;
 import org.apache.ignite.internal.processors.cache.query.CacheQueryType;
@@ -800,7 +798,7 @@ public class GridQueryProcessor extends 
GridProcessorAdapter {
 
                 // Warn about possible implicit deserialization.
                 if (!mustDeserializeClss.isEmpty()) {
-                    U.warn(log, "Some classes in query configuration cannot be 
written in binary format " +
+                    U.warnDevOnly(log, "Some classes in query configuration 
cannot be written in binary format " +
                         "because they either implement Externalizable 
interface or have writeObject/readObject " +
                         "methods. Instances of these classes will be 
deserialized in order to build indexes. Please " +
                         "ensure that all nodes have these classes in 
classpath. To enable binary serialization " +

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java 
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index c522572..523939b 100755
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -4272,6 +4272,30 @@ public abstract class IgniteUtils {
 
     /**
      * Depending on whether or not log is provided and quiet mode is enabled 
logs given
+     * messages as quiet message or normal log WARN message with {@link 
IgniteLogger#DEV_ONLY DEV_ONLY} marker.
+     * If {@code log} is {@code null} or in QUIET mode it will add {@code 
(wrn)} prefix to the message.
+     * If property {@link 
IgniteSystemProperties#IGNITE_DEV_ONLY_LOGGING_DISABLED 
IGNITE_DEV_ONLY_LOGGING_DISABLED}
+     * is set to true, the message will not be logged.
+     *
+     * @param log Optional logger to use when QUIET mode is not enabled.
+     * @param msg Message to log.
+     */
+    public static void warnDevOnly(@Nullable IgniteLogger log, Object msg) {
+        assert msg != null;
+
+        // don't log message if DEV_ONLY messages are disabled
+        if 
(IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_DEV_ONLY_LOGGING_DISABLED))
+            return;
+
+        if (log != null)
+            log.warning(IgniteLogger.DEV_ONLY, compact(msg.toString()), null);
+        else
+            X.println("[" + SHORT_DATE_FMT.format(new java.util.Date()) + "] 
(wrn) " +
+                compact(msg.toString()));
+    }
+
+    /**
+     * Depending on whether or not log is provided and quiet mode is enabled 
logs given
      * messages as quiet message or normal log INFO message.
      * <p>
      * <b>NOTE:</b> unlike the normal logging when INFO level may not be 
enabled and

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/core/src/test/config/log4j2-test.xml
----------------------------------------------------------------------
diff --git a/modules/core/src/test/config/log4j2-test.xml 
b/modules/core/src/test/config/log4j2-test.xml
index 81b14a8..8b46f00 100644
--- a/modules/core/src/test/config/log4j2-test.xml
+++ b/modules/core/src/test/config/log4j2-test.xml
@@ -20,12 +20,12 @@
 <Configuration>
     <Appenders>
         <Console name="CONSOLE" target="SYSTEM_OUT">
-            <PatternLayout pattern="[%d{ISO8601}][%-5p][%t][%c{1}] %m%n"/>
+            <PatternLayout 
pattern="[%d{ISO8601}][%-5p][%t][%c{1}]%notEmpty{[%markerSimpleName]} %m%n"/>
             <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="ACCEPT"/>
         </Console>
 
         <Console name="CONSOLE_ERR" target="SYSTEM_ERR">
-            <PatternLayout pattern="[%d{ISO8601}][%-5p][%t][%c{1}] %m%n"/>
+            <PatternLayout 
pattern="[%d{ISO8601}][%-5p][%t][%c{1}]%notEmpty{[%markerSimpleName]} %m%n"/>
         </Console>
 
         <Routing name="FILE">
@@ -33,7 +33,7 @@
                 <Route>
                     <RollingFile name="Rolling-${sys:nodeId}" 
fileName="${sys:IGNITE_HOME}/work/log/ignite-${sys:nodeId}.log"
                                  
filePattern="${sys:IGNITE_HOME}/work/log/ignite-${sys:nodeId}-%i-%d{yyyy-MM-dd}.log.gz">
-                        <PatternLayout pattern="[%d{ISO8601}][%-5p][%t][%c{1}] 
%m%n"/>
+                        <PatternLayout 
pattern="[%d{ISO8601}][%-5p][%t][%c{1}]%notEmpty{[%markerSimpleName]} %m%n"/>
                         <Policies>
                             <TimeBasedTriggeringPolicy interval="6" 
modulate="true" />
                             <SizeBasedTriggeringPolicy size="10 MB" />

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/core/src/test/config/log4j2-verbose-test.xml
----------------------------------------------------------------------
diff --git a/modules/core/src/test/config/log4j2-verbose-test.xml 
b/modules/core/src/test/config/log4j2-verbose-test.xml
index 50366d3..ff6325b 100644
--- a/modules/core/src/test/config/log4j2-verbose-test.xml
+++ b/modules/core/src/test/config/log4j2-verbose-test.xml
@@ -20,7 +20,7 @@
 <Configuration>
     <Appenders>
         <Console name="CONSOLE_ERR" target="SYSTEM_ERR">
-            <PatternLayout pattern="[%d{ISO8601}][%-5p][%t][%c{1}] %m%n"/>
+            <PatternLayout 
pattern="[%d{ISO8601}][%-5p][%t][%c{1}]%notEmpty{[%markerSimpleName]} %m%n"/>
         </Console>
 
         <Routing name="FILE">
@@ -28,7 +28,7 @@
                 <Route>
                     <RollingFile name="Rolling-${sys:nodeId}" 
fileName="${sys:IGNITE_HOME}/work/log/ignite-${sys:nodeId}.log"
                                  
filePattern="${sys:IGNITE_HOME}/work/log/ignite-${sys:nodeId}-%i-%d{yyyy-MM-dd}.log.gz">
-                        <PatternLayout pattern="[%d{ISO8601}][%-5p][%t][%c{1}] 
%m%n"/>
+                        <PatternLayout 
pattern="[%d{ISO8601}][%-5p][%t][%c{1}]%notEmpty{[%markerSimpleName]} %m%n"/>
                         <Policies>
                             <TimeBasedTriggeringPolicy interval="6" 
modulate="true" />
                             <SizeBasedTriggeringPolicy size="10 MB" />

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteDevOnlyLogTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteDevOnlyLogTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteDevOnlyLogTest.java
new file mode 100644
index 0000000..d769c96
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteDevOnlyLogTest.java
@@ -0,0 +1,105 @@
+/* @java.file.header */
+
+/*  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.internal.util;
+
+import java.io.IOException;
+import java.util.Collections;
+import junit.framework.TestCase;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.IgniteSystemProperties;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+
+/**
+ * Testing logging via {@link IgniteUtils#warnDevOnly(IgniteLogger, Object)}.
+ */
+public class IgniteDevOnlyLogTest extends TestCase {
+    /** Check that dev-only messages appear in the log. */
+    public void testDevOnlyQuietMessage() throws IOException {
+        String oldQuietVal = 
System.setProperty(IgniteSystemProperties.IGNITE_QUIET, "true");
+
+        try (Ignite ignite = startNode()) {
+            String msg = getMessage(ignite);
+            IgniteUtils.warnDevOnly(ignite.log(), msg);
+            assertTrue(readLog(ignite).contains(msg));
+        }
+        finally {
+            setOrClearProperty(IgniteSystemProperties.IGNITE_QUIET, 
oldQuietVal);
+        }
+    }
+
+    /** Check that dev-only messages appear in the log. */
+    public void testDevOnlyVerboseMessage() throws IOException {
+        String oldQuietVal = 
System.setProperty(IgniteSystemProperties.IGNITE_QUIET, "false");
+
+        try (Ignite ignite = startNode()) {
+            String msg = getMessage(ignite);
+            IgniteUtils.warnDevOnly(ignite.log(), msg);
+            assertTrue(readLog(ignite).contains(msg));
+        }
+        finally {
+            setOrClearProperty(IgniteSystemProperties.IGNITE_QUIET, 
oldQuietVal);
+        }
+    }
+
+    /**
+     * Check that {@link IgniteUtils#warnDevOnly(IgniteLogger, Object)}
+     * doesn't print anything if {@link 
org.apache.ignite.IgniteSystemProperties#IGNITE_DEV_ONLY_LOGGING_DISABLED}
+     * is set to {@code true}.
+     */
+    public void testDevOnlyDisabledProperty() throws IOException {
+        String oldDevOnlyVal = 
System.setProperty(IgniteSystemProperties.IGNITE_DEV_ONLY_LOGGING_DISABLED, 
"true");
+
+        try (Ignite ignite = startNode()) {
+            String msg = getMessage(ignite);
+            IgniteUtils.warnDevOnly(ignite.log(), msg);
+            assertFalse(readLog(ignite).contains(msg));
+        }
+        finally {
+            
setOrClearProperty(IgniteSystemProperties.IGNITE_DEV_ONLY_LOGGING_DISABLED, 
oldDevOnlyVal);
+        }
+
+    }
+
+    /** Sets a system property if the value is not null, or clears it if the 
value is null. */
+    private void setOrClearProperty(String key, String val) {
+        if (val != null)
+            System.setProperty(key, val);
+        else
+            System.clearProperty(IgniteSystemProperties.IGNITE_QUIET);
+    }
+
+    /** Starts an Ignite node. */
+    private Ignite startNode() throws IOException {
+        IgniteConfiguration configuration = new IgniteConfiguration()
+            .setIgniteInstanceName(IgniteDevOnlyLogTest.class.getName() + 
"Instance")
+            .setDiscoverySpi(new TcpDiscoverySpi()
+                .setIpFinder(new TcpDiscoveryVmIpFinder()
+                    
.setAddresses(Collections.singletonList("127.0.0.1:47500..47509"))
+                )
+            );
+
+        return Ignition.start(configuration);
+    }
+
+    /** Reads log of the given node to a string. */
+    private String readLog(Ignite ignite) throws IOException {
+        return IgniteUtils.readFileToString(ignite.log().fileName(), "UTF-8");
+    }
+
+    /** Returns a test message. */
+    private String getMessage(Ignite ignite) {
+        // use node id in the message to avoid interference with other tests
+        return "My id is " + ignite.cluster().localNode().id();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/log4j2/pom.xml
----------------------------------------------------------------------
diff --git a/modules/log4j2/pom.xml b/modules/log4j2/pom.xml
index b0d7179..574700a 100644
--- a/modules/log4j2/pom.xml
+++ b/modules/log4j2/pom.xml
@@ -52,13 +52,13 @@
         <dependency>
             <groupId>org.apache.logging.log4j</groupId>
             <artifactId>log4j-api</artifactId>
-            <version>2.8.1</version>
+            <version>${log4j.version}</version>
         </dependency>
 
         <dependency>
             <groupId>org.apache.logging.log4j</groupId>
             <artifactId>log4j-core</artifactId>
-            <version>2.8.1</version>
+            <version>${log4j.version}</version>
         </dependency>
     </dependencies>
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/Log4J2Logger.java
----------------------------------------------------------------------
diff --git 
a/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/Log4J2Logger.java
 
b/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/Log4J2Logger.java
index ee5d9a5..0f5c313 100644
--- 
a/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/Log4J2Logger.java
+++ 
b/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/Log4J2Logger.java
@@ -26,7 +26,6 @@ import java.util.UUID;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
-import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.C1;
 import org.apache.ignite.internal.util.typedef.internal.A;
 import org.apache.ignite.internal.util.typedef.internal.S;
@@ -35,6 +34,8 @@ import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.logger.LoggerNodeIdAware;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.MarkerManager;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
@@ -440,46 +441,66 @@ public class Log4J2Logger implements IgniteLogger, 
LoggerNodeIdAware {
 
     /** {@inheritDoc} */
     @Override public void trace(String msg) {
+        trace(null, msg);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void trace(@Nullable String marker, String msg) {
         if (!isTraceEnabled())
             warning("Logging at TRACE level without checking if TRACE level is 
enabled: " + msg);
 
-        impl.trace(msg);
+        impl.trace(getMarkerOrNull(marker), msg);
     }
 
     /** {@inheritDoc} */
     @Override public void debug(String msg) {
+        debug(null, msg);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void debug(@Nullable String marker, String msg) {
         if (!isDebugEnabled())
             warning("Logging at DEBUG level without checking if DEBUG level is 
enabled: " + msg);
 
-        impl.debug(msg);
+        impl.debug(getMarkerOrNull(marker), msg);
     }
 
     /** {@inheritDoc} */
     @Override public void info(String msg) {
+        info(null, msg);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void info(@Nullable String marker, String msg) {
         if (!isInfoEnabled())
             warning("Logging at INFO level without checking if INFO level is 
enabled: " + msg);
 
-        impl.info(msg);
+        impl.info(getMarkerOrNull(marker), msg);
     }
 
     /** {@inheritDoc} */
-    @Override public void warning(String msg) {
-        impl.warn(msg);
+    @Override public void warning(String msg, @Nullable Throwable e) {
+        warning(null, msg, e);
     }
 
     /** {@inheritDoc} */
-    @Override public void warning(String msg, @Nullable Throwable e) {
-        impl.warn(msg, e);
+    @Override public void warning(@Nullable String marker, String msg, 
@Nullable Throwable e) {
+        impl.warn(getMarkerOrNull(marker), msg, e);
     }
 
     /** {@inheritDoc} */
-    @Override public void error(String msg) {
-        impl.error(msg);
+    @Override public void error(String msg, @Nullable Throwable e) {
+        error(null, msg, e);
     }
 
     /** {@inheritDoc} */
-    @Override public void error(String msg, @Nullable Throwable e) {
-        impl.error(msg, e);
+    @Override public void error(@Nullable String marker, String msg, @Nullable 
Throwable e) {
+        impl.error(getMarkerOrNull(marker), msg, e);
+    }
+
+    /** Returns Marker object for the specified name, or null if the name is 
null */
+    private Marker getMarkerOrNull(@Nullable String marker) {
+        return marker != null ? MarkerManager.getMarker(marker) : null;
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/log4j2/src/test/config/log4j2-markers.xml
----------------------------------------------------------------------
diff --git a/modules/log4j2/src/test/config/log4j2-markers.xml 
b/modules/log4j2/src/test/config/log4j2-markers.xml
new file mode 100644
index 0000000..f9c5898
--- /dev/null
+++ b/modules/log4j2/src/test/config/log4j2-markers.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<Configuration>
+    <Appenders>
+        <File name="FILTERED" 
fileName="${sys:IGNITE_HOME}/work/log/filtered.log" append="false">
+            <PatternLayout 
pattern="[%d{ISO8601}][%-5p][%t][%c{1}]%notEmpty{[%markerSimpleName]} %m%n"/>
+            <MarkerFilter marker="IGNORE_ME" onMatch="DENY" 
onMismatch="NEUTRAL"/>
+        </File>
+
+        <File name="ALL" fileName="${sys:IGNITE_HOME}/work/log/all.log"  
append="false">
+            <PatternLayout 
pattern="[%d{ISO8601}][%-5p]%t][%c{1}]%notEmpty{[%markerSimpleName]} %m%n"/>
+        </File>
+    </Appenders>
+
+    <Loggers>
+        <Root level="TRACE">
+            <AppenderRef ref="FILTERED"/>
+            <AppenderRef ref="ALL"/>
+        </Root>
+    </Loggers>
+</Configuration>

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/log4j2/src/test/java/org/apache/ignite/logger/log4j2/Log4j2LoggerMarkerTest.java
----------------------------------------------------------------------
diff --git 
a/modules/log4j2/src/test/java/org/apache/ignite/logger/log4j2/Log4j2LoggerMarkerTest.java
 
b/modules/log4j2/src/test/java/org/apache/ignite/logger/log4j2/Log4j2LoggerMarkerTest.java
new file mode 100644
index 0000000..672f5d9
--- /dev/null
+++ 
b/modules/log4j2/src/test/java/org/apache/ignite/logger/log4j2/Log4j2LoggerMarkerTest.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.logger.log4j2;
+
+import java.io.File;
+import junit.framework.TestCase;
+import org.apache.ignite.internal.util.typedef.internal.U;
+
+/**
+ * Testing that markers are supported by log4j2 implementation.
+ */
+public class Log4j2LoggerMarkerTest extends TestCase {
+    /** Path to log4j configuration. */
+    private static final String LOG_CONFIG = 
"modules/log4j2/src/test/config/log4j2-markers.xml";
+
+    /** Path to full log. */
+    private static final String LOG_ALL = "work/log/all.log";
+
+    /** Path to filtered log. */
+    private static final String LOG_FILTERED = "work/log/filtered.log";
+
+    /** */
+    @Override protected void setUp() throws Exception {
+        super.setUp();
+
+        Log4J2Logger.cleanup();
+
+        deleteLogs();
+    }
+
+    /** */
+    @Override protected void tearDown() throws Exception {
+        super.tearDown();
+
+        deleteLogs();
+    }
+
+    /** */
+    public void testMarkerFiltering() throws Exception {
+        // create log
+        Log4J2Logger log = new Log4J2Logger(LOG_CONFIG);
+
+        // populate log with messages
+        log.error("IGNORE_ME", "Ignored error", null);
+        log.warning("IGNORE_ME", "Ignored warning", null);
+        log.info("IGNORE_ME", "Ignored info");
+        log.debug("IGNORE_ME", "Ignored debug");
+        log.trace("IGNORE_ME", "Ignored trace");
+
+        log.error("ACCEPT_ME", "Accepted error", null);
+        log.warning("ACCEPT_ME", "Accepted warning", null);
+        log.info("ACCEPT_ME", "Accepted info");
+        log.debug("ACCEPT_ME", "Accepted debug");
+        log.trace("ACCEPT_ME", "Accepted trace");
+
+        // check file with all messages
+        File allFile = U.resolveIgnitePath(LOG_ALL);
+        assertNotNull(allFile);
+        String all = U.readFileToString(allFile.getPath(), "UTF-8");
+
+        assertTrue(all.contains("Ignored error"));
+        assertTrue(all.contains("Ignored warning"));
+        assertTrue(all.contains("Ignored info"));
+        assertTrue(all.contains("Ignored debug"));
+        assertTrue(all.contains("Ignored trace"));
+        assertTrue(all.contains("Accepted error"));
+        assertTrue(all.contains("Accepted warning"));
+        assertTrue(all.contains("Accepted info"));
+        assertTrue(all.contains("Accepted debug"));
+        assertTrue(all.contains("Accepted trace"));
+
+        // check file with one marker filtered out
+        File filteredFile = U.resolveIgnitePath(LOG_FILTERED);
+        assertNotNull(filteredFile);
+        String filtered = U.readFileToString(filteredFile.getPath(), "UTF-8");
+
+        assertFalse(filtered.contains("Ignored error"));
+        assertFalse(filtered.contains("Ignored warning"));
+        assertFalse(filtered.contains("Ignored info"));
+        assertFalse(filtered.contains("Ignored debug"));
+        assertFalse(filtered.contains("Ignored trace"));
+        assertTrue(filtered.contains("Accepted error"));
+        assertTrue(filtered.contains("Accepted warning"));
+        assertTrue(filtered.contains("Accepted info"));
+        assertTrue(filtered.contains("Accepted debug"));
+        assertTrue(filtered.contains("Accepted trace"));
+    }
+
+    /** Delete existing logs, if any */
+    @SuppressWarnings("ResultOfMethodCallIgnored")
+    private void deleteLogs() {
+        new File(LOG_ALL).delete();
+        new File(LOG_FILTERED).delete();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/log4j2/src/test/java/org/apache/ignite/testsuites/IgniteLog4j2TestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/log4j2/src/test/java/org/apache/ignite/testsuites/IgniteLog4j2TestSuite.java
 
b/modules/log4j2/src/test/java/org/apache/ignite/testsuites/IgniteLog4j2TestSuite.java
index a23cb47..66270b2 100644
--- 
a/modules/log4j2/src/test/java/org/apache/ignite/testsuites/IgniteLog4j2TestSuite.java
+++ 
b/modules/log4j2/src/test/java/org/apache/ignite/testsuites/IgniteLog4j2TestSuite.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.testsuites;
 
 import junit.framework.TestSuite;
+import org.apache.ignite.logger.log4j2.Log4j2LoggerMarkerTest;
 import org.apache.ignite.logger.log4j2.Log4j2LoggerSelfTest;
 import org.apache.ignite.logger.log4j2.Log4j2LoggerVerboseModeSelfTest;
 
@@ -32,8 +33,9 @@ public class IgniteLog4j2TestSuite extends TestSuite {
     public static TestSuite suite() throws Exception {
         TestSuite suite = new TestSuite("Log4j2 Logging Test Suite");
 
-        suite.addTest(new TestSuite(Log4j2LoggerSelfTest.class));
-        suite.addTest(new TestSuite(Log4j2LoggerVerboseModeSelfTest.class));
+        suite.addTestSuite(Log4j2LoggerSelfTest.class);
+        suite.addTestSuite(Log4j2LoggerVerboseModeSelfTest.class);
+        suite.addTestSuite(Log4j2LoggerMarkerTest.class);
 
         return suite;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/slf4j/pom.xml
----------------------------------------------------------------------
diff --git a/modules/slf4j/pom.xml b/modules/slf4j/pom.xml
index 1e2a5fc..332ff24 100644
--- a/modules/slf4j/pom.xml
+++ b/modules/slf4j/pom.xml
@@ -46,6 +46,28 @@
             <artifactId>slf4j-api</artifactId>
             <version>${slf4j.version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-core</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <version>${log4j.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-core</artifactId>
+            <version>${log4j.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/slf4j/src/main/java/org/apache/ignite/logger/slf4j/Slf4jLogger.java
----------------------------------------------------------------------
diff --git 
a/modules/slf4j/src/main/java/org/apache/ignite/logger/slf4j/Slf4jLogger.java 
b/modules/slf4j/src/main/java/org/apache/ignite/logger/slf4j/Slf4jLogger.java
index 2450850..0cc31e4 100644
--- 
a/modules/slf4j/src/main/java/org/apache/ignite/logger/slf4j/Slf4jLogger.java
+++ 
b/modules/slf4j/src/main/java/org/apache/ignite/logger/slf4j/Slf4jLogger.java
@@ -22,6 +22,8 @@ import org.apache.ignite.internal.util.typedef.internal.S;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.Marker;
+import org.slf4j.MarkerFactory;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_QUIET;
 
@@ -78,46 +80,66 @@ public class Slf4jLogger implements IgniteLogger {
 
     /** {@inheritDoc} */
     @Override public void trace(String msg) {
+        trace(null, msg);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void trace(@Nullable String marker, String msg) {
         if (!impl.isTraceEnabled())
             warning("Logging at TRACE level without checking if TRACE level is 
enabled: " + msg);
 
-        impl.trace(msg);
+        impl.trace(getMarkerOrNull(marker), msg);
     }
 
     /** {@inheritDoc} */
     @Override public void debug(String msg) {
+        debug(null, msg);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void debug(@Nullable String marker, String msg) {
         if (!impl.isDebugEnabled())
             warning("Logging at DEBUG level without checking if DEBUG level is 
enabled: " + msg);
 
-        impl.debug(msg);
+        impl.debug(getMarkerOrNull(marker), msg);
     }
 
     /** {@inheritDoc} */
     @Override public void info(String msg) {
+        info(null, msg);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void info(@Nullable String marker, String msg) {
         if (!impl.isInfoEnabled())
             warning("Logging at INFO level without checking if INFO level is 
enabled: " + msg);
 
-        impl.info(msg);
+        impl.info(getMarkerOrNull(marker), msg);
     }
 
     /** {@inheritDoc} */
-    @Override public void warning(String msg) {
-        impl.warn(msg);
+    @Override public void warning(String msg, @Nullable Throwable e) {
+        warning(null, msg, e);
     }
 
     /** {@inheritDoc} */
-    @Override public void warning(String msg, @Nullable Throwable e) {
-        impl.warn(msg, e);
+    @Override public void warning(@Nullable String marker, String msg, 
@Nullable Throwable e) {
+        impl.warn(getMarkerOrNull(marker), msg, e);
     }
 
     /** {@inheritDoc} */
-    @Override public void error(String msg) {
-        impl.error(msg);
+    @Override public void error(String msg, @Nullable Throwable e) {
+        error(null, msg, e);
     }
 
     /** {@inheritDoc} */
-    @Override public void error(String msg, @Nullable Throwable e) {
-        impl.error(msg, e);
+    @Override public void error(@Nullable String marker, String msg, @Nullable 
Throwable e) {
+        impl.error(getMarkerOrNull(marker), msg, e);
+    }
+
+    /** Returns Marker object for the specified name, or null if the name is 
null */
+    private Marker getMarkerOrNull(@Nullable String marker) {
+        return marker != null ? MarkerFactory.getMarker(marker) : null;
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/slf4j/src/test/java/org/apache/ignite/logger/slf4j/Slf4jLoggerMarkerTest.java
----------------------------------------------------------------------
diff --git 
a/modules/slf4j/src/test/java/org/apache/ignite/logger/slf4j/Slf4jLoggerMarkerTest.java
 
b/modules/slf4j/src/test/java/org/apache/ignite/logger/slf4j/Slf4jLoggerMarkerTest.java
new file mode 100644
index 0000000..578e6ba
--- /dev/null
+++ 
b/modules/slf4j/src/test/java/org/apache/ignite/logger/slf4j/Slf4jLoggerMarkerTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.logger.slf4j;
+
+import java.io.File;
+import junit.framework.TestCase;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Testing that markers are supported by log4j2 implementation.
+ */
+public class Slf4jLoggerMarkerTest extends TestCase {
+    /** Path to full log. */
+    private static final String LOG_ALL = "work/log/all.log";
+
+    /** Path to filtered log. */
+    private static final String LOG_FILTERED = "work/log/filtered.log";
+
+    /** */
+    @Override protected void setUp() throws Exception {
+        super.setUp();
+
+        deleteLogs();
+    }
+
+    /** */
+    @Override protected void tearDown() throws Exception {
+        super.tearDown();
+
+        deleteLogs();
+    }
+
+    /** */
+    public void testMarkerFiltering() throws Exception {
+        // create log
+        Slf4jLogger log = new 
Slf4jLogger(LoggerFactory.getLogger(Slf4jLoggerMarkerTest.class));
+
+        // populate log with messages
+        log.error("IGNORE_ME", "Ignored error", null);
+        log.warning("IGNORE_ME", "Ignored warning", null);
+        log.info("IGNORE_ME", "Ignored info");
+        log.debug("IGNORE_ME", "Ignored debug");
+        log.trace("IGNORE_ME", "Ignored trace");
+
+        log.error("ACCEPT_ME", "Accepted error", null);
+        log.warning("ACCEPT_ME", "Accepted warning", null);
+        log.info("ACCEPT_ME", "Accepted info");
+        log.debug("ACCEPT_ME", "Accepted debug");
+        log.trace("ACCEPT_ME", "Accepted trace");
+
+        // check file with all messages
+        File allFile = U.resolveIgnitePath(LOG_ALL);
+        assertNotNull(allFile);
+        String all = U.readFileToString(allFile.getPath(), "UTF-8");
+
+        assertTrue(all.contains("[IGNORE_ME] Ignored error"));
+        assertTrue(all.contains("[IGNORE_ME] Ignored warning"));
+        assertTrue(all.contains("[IGNORE_ME] Ignored info"));
+        assertTrue(all.contains("[IGNORE_ME] Ignored debug"));
+        assertTrue(all.contains("[IGNORE_ME] Ignored trace"));
+
+        assertTrue(all.contains("[ACCEPT_ME] Accepted error"));
+        assertTrue(all.contains("[ACCEPT_ME] Accepted warning"));
+        assertTrue(all.contains("[ACCEPT_ME] Accepted info"));
+        assertTrue(all.contains("[ACCEPT_ME] Accepted debug"));
+        assertTrue(all.contains("[ACCEPT_ME] Accepted trace"));
+
+        // check file with one marker filtered out
+        File filteredFile = U.resolveIgnitePath(LOG_FILTERED);
+        assertNotNull(filteredFile);
+        String filtered = U.readFileToString(filteredFile.getPath(), "UTF-8");
+
+        assertFalse(filtered.contains("[IGNORE_ME] Ignored error"));
+        assertFalse(filtered.contains("[IGNORE_ME] Ignored warning"));
+        assertFalse(filtered.contains("[IGNORE_ME] Ignored info"));
+        assertFalse(filtered.contains("[IGNORE_ME] Ignored debug"));
+        assertFalse(filtered.contains("[IGNORE_ME] Ignored trace"));
+
+        assertTrue(filtered.contains("[ACCEPT_ME] Accepted error"));
+        assertTrue(filtered.contains("[ACCEPT_ME] Accepted warning"));
+        assertTrue(filtered.contains("[ACCEPT_ME] Accepted info"));
+        assertTrue(filtered.contains("[ACCEPT_ME] Accepted debug"));
+        assertTrue(filtered.contains("[ACCEPT_ME] Accepted trace"));
+    }
+
+    /** Delete existing logs, if any */
+    @SuppressWarnings("ResultOfMethodCallIgnored")
+    private void deleteLogs() {
+        new File(LOG_ALL).delete();
+        new File(LOG_FILTERED).delete();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/slf4j/src/test/java/org/apache/ignite/testsuites/IgniteSlf4jTestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/slf4j/src/test/java/org/apache/ignite/testsuites/IgniteSlf4jTestSuite.java
 
b/modules/slf4j/src/test/java/org/apache/ignite/testsuites/IgniteSlf4jTestSuite.java
new file mode 100644
index 0000000..8668f92
--- /dev/null
+++ 
b/modules/slf4j/src/test/java/org/apache/ignite/testsuites/IgniteSlf4jTestSuite.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.testsuites;
+
+import junit.framework.TestSuite;
+import org.apache.ignite.logger.slf4j.Slf4jLoggerMarkerTest;
+
+/**
+ * Slf4j logging tests.
+ */
+public class IgniteSlf4jTestSuite extends TestSuite {
+    /**
+     * @return Test suite.
+     */
+    public static TestSuite suite() {
+        TestSuite suite = new TestSuite("Slf4j Logging Test Suite");
+
+        suite.addTestSuite(Slf4jLoggerMarkerTest.class);
+
+        return suite;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/modules/slf4j/src/test/resources/log4j2-test.xml
----------------------------------------------------------------------
diff --git a/modules/slf4j/src/test/resources/log4j2-test.xml 
b/modules/slf4j/src/test/resources/log4j2-test.xml
new file mode 100644
index 0000000..d30736e
--- /dev/null
+++ b/modules/slf4j/src/test/resources/log4j2-test.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<Configuration>
+    <Appenders>
+        <File name="FILTERED" fileName="work/log/filtered.log" append="false">
+            <PatternLayout 
pattern="[%d{ISO8601}][%-5p][%t][%c{1}]%notEmpty{[%markerSimpleName]} %m%n"/>
+            <MarkerFilter marker="IGNORE_ME" onMatch="DENY" 
onMismatch="NEUTRAL"/>
+        </File>
+
+        <File name="ALL" fileName="work/log/all.log"  append="false">
+            <PatternLayout 
pattern="[%d{ISO8601}][%-5p][%t][%c{1}]%notEmpty{[%markerSimpleName]} %m%n"/>
+        </File>
+    </Appenders>
+
+    <Loggers>
+        <Root level="TRACE">
+            <AppenderRef ref="FILTERED"/>
+            <AppenderRef ref="ALL"/>
+        </Root>
+    </Loggers>
+</Configuration>

http://git-wip-us.apache.org/repos/asf/ignite/blob/edc5a5f3/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 26339af..0ec294a 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -91,6 +91,7 @@
         <jtidy.version>r938</jtidy.version>
         <kafka.version>0.10.0.1</kafka.version>
         <karaf.version>4.0.2</karaf.version>
+        <log4j.version>2.8.1</log4j.version>
         <lucene.bundle.version>5.5.2_1</lucene.bundle.version>
         <lucene.version>5.5.2</lucene.version>
         <maven.bundle.plugin.version>2.5.4</maven.bundle.plugin.version>

Reply via email to