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
>>>
>>>