Anton Johansson created LOG4J2-2021:
---------------------------------------
Summary: Complex sifting/routing appender configuration
Key: LOG4J2-2021
URL: https://issues.apache.org/jira/browse/LOG4J2-2021
Project: Log4j 2
Issue Type: Question
Components: Appenders
Reporter: Anton Johansson
We're currently in the process of upgrading some of our components, including
upgrading from Log4J to Log4J2.
We previously had this configuration for splitting different logs to different
files:
{{
log4j.appender.File=org.apache.log4j.sift.MDCSiftingAppender
log4j.appender.File.key=instanceId
log4j.appender.File.default=Unspecified
log4j.appender.File.appender=org.apache.log4j.sift.MDCSiftingAppender
log4j.appender.File.appender.key=bundleName
log4j.appender.File.appender.default=unspecified
log4j.appender.File.appender.appender=org.apache.log4j.RollingFileAppender
log4j.appender.File.appender.appender.layout=org.apache.log4j.PatternLayout
log4j.appender.File.appender.appender.layout.ConversionPattern=%d{ISO8601} |
%-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} -
%X{bundle.version} | %m%n
log4j.appender.File.appender.appender.file=${karaf.data}/log/$\\{instanceId\\}/$\\{bundleName\\}.log
log4j.appender.File.appender.appender.append=true
log4j.appender.File.appender.appender.maxFileSize=1MB
log4j.appender.File.appender.appender.maxBackupIndex=10
}}
This means we get different folders for different customers ({{instanceId}})
and different files for different OSGi bundles ({{bundleName}}) within those
folders. This is a pretty sweet setup. To do the same in Log4J2, with XML
configuration, I had to do this:
{{
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Routing name="Routing">
<Routes pattern="$${ctx:instanceId}">
<!-- Has the 'instanceId' key -->
<Route>
<Routing name="RoutingWithInstance">
<Routes pattern="$${ctx:bundleName}">
<!-- Has the 'bundleName' key -->
<Route>
<RollingFile name="Rolling-${ctx:bundle.name}"
fileName="${sys:karaf.data}/log/${ctx:instanceId}/${ctx:bundleName}.log"
filePattern="${sys:karaf.data}/log/${ctx:bundleName}.log.%i">
<PatternLayout>
<pattern>%d{ISO8601} | %-5p |
%X{instanceId} | %-16t | %-32c{1} | %X{bundle.id} - %X{bundle.name} -
%X{bundle.version} | %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="1MB" />
</Policies>
<DefaultRolloverStrategy max="9" />
</RollingFile>
</Route>
<!-- Missing the 'bundleName' key -->
<Route key="$${ctx:bundleName}">
<RollingFile name="Rolling-unspecified"
fileName="${sys:karaf.data}/log/${ctx:instanceId}/unspecified.log"
filePattern="${sys:karaf.data}/log/unspecified.log.%i">
<PatternLayout>
<pattern>%d{ISO8601} | %-5p |
%X{instanceId} | %-16t | %-32c{1} | %X{bundle.id} - %X{bundle.name} -
%X{bundle.version} | %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="1MB" />
</Policies>
<DefaultRolloverStrategy max="9" />
</RollingFile>
</Route>
</Routes>
</Routing>
</Route>
<!-- Missing the 'instanceId' key -->
<Route key="$${ctx:instanceId}">
<Routing name="RoutingWithoutInstance">
<Routes pattern="$${ctx:bundleName}">
<!-- Has the 'bundleName' key -->
<Route>
<RollingFile name="Rolling-${ctx:bundle.name}"
fileName="${sys:karaf.data}/log/Unspecified/${ctx:bundleName}.log"
filePattern="${sys:karaf.data}/log/${ctx:bundleName}.log.%i">
<PatternLayout>
<pattern>%d{ISO8601} | %-5p |
%X{instanceId} | %-16t | %-32c{1} | %X{bundle.id} - %X{bundle.name} -
%X{bundle.version} | %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="1MB" />
</Policies>
<DefaultRolloverStrategy max="9" />
</RollingFile>
</Route>
<!-- Missing the 'bundleName' key -->
<Route key="$${ctx:bundleName}">
<RollingFile name="Rolling-unspecified"
fileName="${sys:karaf.data}/log/Unspecified/unspecified.log"
filePattern="${sys:karaf.data}/log/unspecified.log.%i">
<PatternLayout>
<pattern>%d{ISO8601} | %-5p |
%X{instanceId} | %-16t | %-32c{1} | %X{bundle.id} - %X{bundle.name} -
%X{bundle.version} | %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="1MB" />
</Policies>
<DefaultRolloverStrategy max="9" />
</RollingFile>
</Route>
</Routes>
</Routing>
</Route>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Logger name="com.viskan" level="DEBUG" />
<Root level="INFO">
<AppenderRef ref="Routing" />
</Root>
</Loggers>
</Configuration>
}}
This looks much more complex, and I have lots of redundant configurations
(policies, strategies, layouts).
Is there an easier way to do this that I've missed?
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)