I have made some modification in the previous code that I had sent and there is no error or warning while configuration initialization, but logs are not going to the destination server But if I try the same thing using log4j2.xml it is working fine.
Below is my updated code: LoggerContext ctx = (LoggerContext) LogManager.getContext(false); Configuration config = ctx.getConfiguration(); SyslogAppender syslogAppender = SyslogAppender.newSyslogAppenderBuilder() .setName("syslog") .setProtocol(Protocol.UDP) .setHost(hostname) .setPort(port) .setAppName("service_name") .setId("service_name") .setFacility(Facility.LOCAL0) .setNewLine(true) .setFormat("RFC5424") .setIgnoreExceptions(false) .build(); syslogAppender.start(); config.addAppender(syslogAppender); RoutingAppender.Builder routingBuilder = RoutingAppender.newBuilder(); routingBuilder.setConfiguration(config); routingBuilder.setName("RoutingConfig"); Node node = null; Route[] routeList = new Route[1]; routeList[0] = Route.createRoute("syslog", "domain#client", node); routingBuilder.withRoutes( Routes.newBuilder().withPattern("$${ctx:module}") .withRoutes(routeList) .build()); RoutingAppender routingAppender = routingBuilder.build(); routingAppender.start(); config.addAppender(routingAppender); AppenderRef ref = AppenderRef.createAppenderRef("RoutingConfig", Level.DEBUG, null); AppenderRef[] refs = new AppenderRef[] { ref }; LoggerConfig loggerConfig = LoggerConfig.newBuilder() .withAdditivity(false) .withLevel(Level.DEBUG) .withLoggerName("RoutingLogger") .withIncludeLocation("true") .withRefs(refs) .withConfig(config) .build(); LoggerConfig rootLoggerConfig = LoggerConfig.newBuilder() .withLevel(Level.DEBUG) .withLoggerName(LogManager.ROOT_LOGGER_NAME) .withIncludeLocation("true") .withRefs(refs) .withConfig(config) .build(); loggerConfig.addAppender(routingAppender, Level.DEBUG, null); rootLoggerConfig.addAppender(routingAppender, Level.DEBUG, null); config.addLogger("RoutingLogger", loggerConfig); config.addLogger(LogManager.ROOT_LOGGER_NAME, loggerConfig); ctx.updateLoggers(); Logger logger = LogManager.getLogger("RoutingLogger"); ThreadContext.put("module", "domain#client"); logger.info("message from domain client"); logger.error("message form domain client error"); ThreadContext.remove("module"); Please can any one tell me what am I missing in the above programmatic approach On Thu, Oct 19, 2023 at 6:59 PM Ganesh S <ganesh123.g...@gmail.com> wrote: > 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 >>> >>>