Can anyone please help me on this issue?
On Fri, Oct 20, 2023, 12:23 AM Ganesh S <[email protected]> wrote:
> 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 <[email protected]> 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 <[email protected]>
>> wrote:
>>
>>> Is there any reference for creating routing appender programmatically ?
>>>
>>> On Thu, Oct 19, 2023, 9:35 AM Ralph Goers <[email protected]>
>>> 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 <[email protected]>
>>>> 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
>>>>
>>>>