Search code examples
ignite

Configure Ignite logger and appender using java


I want to configure the ignite log4j2 configuration programatically instead of xml. How to configure ignite log4j2 configuration using java? Can anyone help?


Solution

  • Unfortunately built-it Ignite integration doesn't support pure programmatic way of configuration at the moment.

    But in fact you're able to use slf4j logging facade backed by the log4j2 under the hood. In this case you'll have some sort of a full power over logging configuration. In order to achieve that you should add log4j2 dependencies manually as well as ignite-slf4j dependency. In the meanwhile you need log4j2 slf4j binding to allow Ignite logging facilities transfer calls to the log4j2.

    For instance if you use maven then your pom.xml should contain:

    <dependency>
        <groupId>org.apache.ignite</groupId>
        <artifactId>ignite-slf4j</artifactId>
        <version>${ignite.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.13.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.13.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.13.3</version>
    </dependency>
    

    After that you'll be able to follow official insеructions to configure that stuff. For example you can try adding a class that extends org.apache.logging.log4j.core.config.ConfigurationFactory to your classpath. It could look somehow like that:

    import java.net.URI;
    import org.apache.logging.log4j.Level;
    import org.apache.logging.log4j.core.Filter;
    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.ConfigurationFactory;
    import org.apache.logging.log4j.core.config.ConfigurationSource;
    import org.apache.logging.log4j.core.config.Order;
    import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
    import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
    import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
    import org.apache.logging.log4j.core.config.plugins.Plugin;
    
    @Plugin(name = "CustomConfigurationFactory", category = ConfigurationFactory.CATEGORY)
    @Order(50)
    public class CustomConfigurationFactory extends ConfigurationFactory {
    
        static Configuration createConfiguration(final String name, ConfigurationBuilder<BuiltConfiguration> builder) {
            builder.setConfigurationName(name);
            builder.setStatusLevel(Level.ERROR);
            builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL).
                addAttribute("level", Level.DEBUG));
            AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").
                addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
            appenderBuilder.add(builder.newLayout("PatternLayout").
                addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
            appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.DENY,
                Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));
            builder.add(appenderBuilder);
            builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG).
                add(builder.newAppenderRef("Stdout")).
                addAttribute("additivity", false));
            builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
    
            return builder.build();
        }
    
        @Override
        public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
            return getConfiguration(loggerContext, source.toString(), null);
        }
    
        @Override
        public Configuration getConfiguration(final LoggerContext loggerContext, final String name, final URI configLocation) {
            ConfigurationBuilder<BuiltConfiguration> builder = newConfigurationBuilder();
            return createConfiguration(name, builder);
        }
    
        @Override
        protected String[] getSupportedTypes() {
            return new String[] {"*"};
        }
    }
    

    It would be possible to make logging customization there.