Is it possible to setup logback configuration programmatically?

I am new to logback, I want configure logback programmatically. Currently I am using static configuration like below:

<configuration>
    <appender name="KIWI" class="ch.qos.logback.classic.net.SyslogAppender">
        <syslogHost>localhost:8080</syslogHost>
        <facility>LOCAL0</facility>
        <suffixPattern>%thread: %-5level %logger{36} - %msg%n</suffixPattern>
    </appender>
    
    <logger name="com.javacodegeeks.examples.logbacksyslogexample.message.kiwi" level="INFO">
        <appender-ref ref="KIWI" />
    </logger>
</configuration>

Is it possible to set the syslogHost dynamically?

Upvotes: 3

Views: 3744

Answers (1)

ozkanpakdil
ozkanpakdil

Reputation: 4602

Yes it is possible to configure logback programmatically, you need to extend ContextAwareBase and implement Configurator, like code below

public class MyLogbackConfigurer extends ContextAwareBase implements Configurator {
    @Override
    public void configure(LoggerContext lc) {
        addInfo("Setting up default configuration.");

        ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<ILoggingEvent>();
        ca.setContext(lc);
        ca.setName("console");
        LayoutWrappingEncoder<ILoggingEvent> encoder = new LayoutWrappingEncoder<ILoggingEvent>();
        encoder.setContext(lc);


        // same as
        // PatternLayout layout = new PatternLayout();
        // layout.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
        TTLLLayout layout = new TTLLLayout();

        layout.setContext(lc);
        layout.start();
        encoder.setLayout(layout);

        ca.setEncoder(encoder);
        ca.start();

        FileAppender f=new FileAppender();
        f.setEncoder(encoder);
        f.setLayout(layout);
        f.setContext(lc);
        f.setFile("log.log");
        f.setAppend(true);
        f.setName("logFile");
        f.start();

        Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        rootLogger.addAppender(ca);
        rootLogger.addAppender(f);


        Logger springLogger = lc.getLogger("org.springframework");
        springLogger.setLevel(Level.WARN);

    }
}

and you will need to create a file under src/main/resources/META-INF/services/ch.qos.logback.classic.spi.Configurator which will have the class name of your configurer. Here is my example and for the config.

I did not use SyslogAppender before but you can change the example I gave and you can use System.getProperty("proName") or System.getenv("envName")

Before start implementing everything from scratch, have you tried to change xml like below ?

 <syslogHost>${SYSLOG}</syslogHost>

And run the jar like this "java -jar yourjarpath.jar -DSYSLOG=localhost:8080" this way you will not need to write that configure class detailed doc.

Upvotes: 6

Related Questions