Need help to Configure Log Appenders at runtime

3,970 views
Skip to first unread message

Radhakrishna Kalyan

unread,
Dec 12, 2014, 1:20:11 PM12/12/14
to dropwiz...@googlegroups.com
Hi ,

We have a rest application developed using Dropwizard 0.8x
We have an issue with log appenders. We want to add/modify log appenders at runtime (based on certain log configuration) without restarting our application.

Every 10 mins our application fetchs the logging configurations(i.e which log appender to use, log pattern etc) from a different rest application.

In our yml file we configure to have an appender by default as console. So when the application starts for the first time it configures to use Console Appender.

But if the log append settings are modified from console to use syslog then at runtime I want to use SyslogAppender instead of ConsoleAppender.
I want to know if there is any way we can programmatically modify/add the appenders at runtime.

Thanks in advance.

Kalyan

Prajwal Tuladhar

unread,
Dec 12, 2014, 3:14:21 PM12/12/14
to dropwiz...@googlegroups.com
May be something like:

import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.net.SyslogAppender;


//
// 
//
final Logger root = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
root.detachAndStopAllAppenders();

root.addAppender(new SyslogAppender()); 

// or if you want to use async appender
Appender<ILoggingEvent> asyncAppender = AsyncAppender.wrap(new SyslogAppender());
root.addAppender(asyncAppender);






Kalyan

--
You received this message because you are subscribed to the Google Groups "dropwizard-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to dropwizard-de...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


--
-- Praj

Radhakrishna Kalyan

unread,
Dec 12, 2014, 7:24:41 PM12/12/14
to dropwiz...@googlegroups.com
Hi Prajwal,

Thank you for the email.
I am doing approximatly similar way. Here is my code.
Kindly let me know if there are any mistakes.


 private class LogSettingsRefresher extends TimerTask {

persistenceConfiguration = // implements org.apache.commons.configuration.Configuration
  

        @Override
        public void run() {
            try {
                LOG.info("Refreshing log settings.");
                final ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
                root.setLevel(Level.toLevel(persistenceConfiguration.getString(LOG_ROOT_LEVEL)));
                final Iterator<Appender<ILoggingEvent>> iteratorForAppenders = root.iteratorForAppenders();
                while (iteratorForAppenders.hasNext()) {
                    Appender<ILoggingEvent> appender = iteratorForAppenders.next();
                    if (StringUtils.containsIgnoreCase(appender.getName(), "syslog")
                            || StringUtils.containsIgnoreCase(appender.getName(), "console")) {
                        boolean createSysLogAppender = false;
                        appender.stop();
                        root.detachAppender(appender.getName());
                        if (StringUtils.containsIgnoreCase(persistenceConfiguration.getString(LOG_APPENDER), "syslog")
                                || (appender instanceof SyslogAppender)) {
                            createSysLogAppender = true;
                        }
                       
                        if(createSysLogAppender){
                            SyslogAppenderFactory syslogAppenderFactory = new SyslogAppenderFactory();
                            syslogAppenderFactory.setHost(persistenceConfiguration.getString(LOG_SYS_HOST));
                            syslogAppenderFactory.setFacility(Facility.valueOf(persistenceConfiguration.getString(LOG_SYS_FACILITY).toUpperCase()));
                            syslogAppenderFactory.setLogFormat(persistenceConfiguration.getString(LOG_LAYOUT));
                            Appender<ILoggingEvent> syslogAppender = syslogAppenderFactory.build(root.getLoggerContext(), getName(), null);
                            root.addAppender(syslogAppender);
                        }else{
                            ConsoleAppenderFactory appenderFactory = new ConsoleAppenderFactory();
                            appenderFactory.setLogFormat(persistenceConfiguration.getString(LOG_LAYOUT));
                            Appender<ILoggingEvent> consoleAppender = appenderFactory.build(root.getLoggerContext(), getName(), null);
                            root.addAppender(consoleAppender);
                        }
                    }
                }
                LOG.info("Refreshing log settings Done.");
            } catch (Exception e) {
                // Ignore
                LOG.debug("some exception occured while refreshing the log settings", e);
            }
        }
    }
Reply all
Reply to author
Forward
0 new messages