Trying to configure routing appender programmatically Unable to figure out completely. The current code for this is as below, which is not currently working. Need help to complete this code.
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder(); AppenderComponentBuilder syslogAppender = builder.newAppender("syslog", "Syslog") .addAttribute("protocol", "UDP") .addAttribute("host", hostname) .addAttribute("port", port) .addAttribute("appName", "serviceName") .addAttribute("id", "serviceName") .addAttribute("facility", "LOCAL0") .addAttribute("newLine", true) .addAttribute("format", "RFC5424") .addAttribute("ignoreExceptions", false); syslogAppender.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.DENY) .addAttribute("level", Level.DEBUG)); builder.add(syslogAppender); Configuration config = builder.build(); RoutingAppender.Builder routingBuilder = RoutingAppender.newBuilder(); routingBuilder.setConfiguration(config); routingBuilder.setName("RoutingConfig"); Node node = null; Route[] routeList = new Route[1]; routeList[0] = Route.createRoute("syslog", "client1", node); routingBuilder.withRoutes( Routes.newBuilder().withPattern("$${ctx:module}") .withRoutes(routeList) .build()); RoutingAppender routingAppender = routingBuilder.build(); routingAppender.start(); config.addAppender(routingAppender); builder.add(builder.newLogger("RoutingLogger", Level.DEBUG) .add(builder.newAppenderRef("RoutingConfig")) .addAttribute("additivity", false)); config = builder.build(); config.addLogger("RoutingLogger", config.getLoggerConfig("RoutingLogger")); Configurator.reconfigure(config); LoggerContext ctx = (LoggerContext) LogManager.getContext(false); ctx.updateLoggers(); Logger logger = LogManager.getLogger("RoutingLogger"); ThreadContext.put("module", "client1"); logger.info("message from client"); logger.error("message form client error"); ThreadContext.remove("module"); On Thu, Oct 19, 2023 at 2:27 PM Ganesh S <ganesh123.g...@gmail.com> wrote: > Is there any reference for creating routing appender programmatically ? > > On Thu, Oct 19, 2023, 9:35 AM Ralph Goers <ralph.go...@dslextreme.com> > wrote: > >> Why are you doing it this way? Can you not just use the RoutingAppender? >> https://logging.apache.org/log4j/2.x/manual/appenders.html#RoutingAppender >> >> Ralph >> >> > On Oct 18, 2023, at 8:50 PM, Ganesh S <ganesh123.g...@gmail.com> wrote: >> > >> > Hello, >> > I'm trying to create different logger with different hostname and port >> for >> > different client requests to the server. >> > If a new client request comes, I will store the information in the >> thread >> > local object and based on the information I need to append a new logger >> > object to the existing configuration object using CompositeConfiguration >> > and update loggers in the logger context. >> > I'm using the name of the logger object not to have a package level >> > hierarchy but just as a named (client name) logger. >> > >> > Currently I'm getting the below error when I try to append new syslog >> using >> > CompositeConfiguration >> > at the line >> > logContext.reconfigure(compositeConfiguration); >> > >> > ERROR StatusConsoleListener Appender references must contain a reference >> > ERROR StatusConsoleListener Null object returned for AppenderRef in >> Logger. >> > ERROR StatusConsoleListener No appender name provided >> > ERROR StatusConsoleListener Could not create plugin of type class >> > org.apache.logging.log4j.core.appender.SyslogAppender for element Syslog >> > org.apache.logging.log4j.core.config.ConfigurationException: Arguments >> > given for element Syslog are invalid: field 'name' has invalid value >> 'null' >> > at >> > >> org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.injectFields(PluginBuilder.java:199) >> > ..... >> > at >> > >> org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:621) >> > at >> > >> org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:715) >> > ERROR StatusConsoleListener Null object returned for Syslog in >> Appenders. >> > >> > >> > Below is my implementation >> > >> > ConfigurationBuilder<BuiltConfiguration> builder1 = >> > ConfigurationBuilderFactory.newConfigurationBuilder(); >> > AppenderComponentBuilder syslogAppender1 = >> > builder1.newAppender("syslog", "Syslog") >> > .addAttribute("protocol", "UDP") >> > .addAttribute("host", hostname) >> > .addAttribute("port", port1) >> > .addAttribute("appName", "serviceName") >> > .addAttribute("id", "serviceName") >> > .addAttribute("facility", "LOCAL0") >> > .addAttribute("newLine", true) >> > .addAttribute("format", "RFC5424") >> > .addAttribute("ignoreExceptions", false); >> > syslogAppender1.add(builder1.newFilter("ThresholdFilter", >> > Filter.Result.ACCEPT, Filter.Result.DENY) >> > .addAttribute("level", Level.DEBUG)); >> > builder1.add(syslogAppender1); >> > >> > builder1.add(builder1.newLogger("client1", Level.DEBUG) >> > .add(builder1.newAppenderRef("syslog")) >> > .addAttribute("additivity", false)); >> > Configurator.reconfigure(builder1.build()); >> > >> > Logger logger = LogManager.getLogger("client1"); >> > logger.info("client1 message1"); >> > >> > ConfigurationBuilder<BuiltConfiguration> builder = >> > ConfigurationBuilderFactory.newConfigurationBuilder(); >> > AppenderComponentBuilder syslogAppender = builder.newAppender("syslog1", >> > "Syslog") >> > .addAttribute("protocol", "UDP") >> > .addAttribute("host", hostname) >> > .addAttribute("port", port2) >> > .addAttribute("appName", "serviceName") >> > .addAttribute("id", "serviceName") >> > .addAttribute("facility", "LOCAL0") >> > .addAttribute("newLine", true) >> > .addAttribute("format", "RFC5424") >> > .addAttribute("ignoreExceptions", false); >> > >> > syslogAppender.add(builder.newFilter("ThresholdFilter", >> > Filter.Result.ACCEPT, Filter.Result.DENY) >> > .addAttribute("level", Level.DEBUG)); >> > builder.add(syslogAppender); >> > >> > builder.add(builder.newLogger("client2", Level.DEBUG) >> > .add(builder.newAppenderRef("syslog1")) >> > .addAttribute("additivity", false)); >> > >> > LoggerContext logContext = LoggerContext.getContext(false); >> > org.apache.logging.log4j.core.config.Configuration configurationcore = >> > logContext.getConfiguration(); >> > List<AbstractConfiguration> configurationList = new ArrayList<>(); >> > if (configurationcore != null) >> > configurationList.add((AbstractConfiguration) configurationcore); >> > org.apache.logging.log4j.core.config.Configuration newconfig = >> > builder.build(); >> > configurationList.add((AbstractConfiguration) newconfig); >> > CompositeConfiguration compositeConfiguration = new >> > CompositeConfiguration(configurationList); >> > logContext.reconfigure(compositeConfiguration); >> > logContext.updateLoggers(); >> > >> > Logger logger1 = LogManager.getLogger("client2"); >> > logger1.info("client2 message1"); >> > logger1.info("client2 message2"); >> > logger.info("client1 message2"); >> > logger1.info("client2 message3"); >> > logger.info("client1 message3"); >> > >> > >> > Thank you, >> > Ganesh S >> >>