[
https://issues.apache.org/jira/browse/LOG4J2-2021?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Anton Johansson updated LOG4J2-2021:
------------------------------------
Affects Version/s: 2.6
Description:
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?
was:
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?
> 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
> Affects Versions: 2.6
> 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)