log4j2 custom layout not working with Rolling appender file - layout

I'm working with log4j2 and rolling appender file.
I want to use a customize layout but it's not working properly.
I'm working with JBoss. I have put the lib with the cusotmize layout in the libs directory, so it's in the class path.
In the log4j2.xml, I have put the following configuration:
<Configuration status="trace" packages="mypackage.audit">
...
<Routing name="RoutingAppender">
<Routes pattern="$${ctx:FlowName">
<Route>
<RollingFile name="Rolling-${ctx:FlowName}" fileName="logs/Audit-${ctx:FlowName}.log"
filePattern="./logs/Audit-${ctx:FlowName}-%d{yyyy-MM-dd}-%i.log.gz" >
<PatternLayout>
<pattern>%d{ISO8601} [%t] %p %c{3} - %m%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="6" modulate="true" />
</Policies>
<Layout type="AuditLayout" locationInfo="true"/>
</RollingFile>
</Route>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Logger name="CustomizeAuditing" level="info" >
<AppenderRef ref="RoutingAppender"/>
</Logger>
</Loggers>
</Configuration>
But nothing is logged correctly!
Thanks in advance
Jamila

following worked for me:
log4j2 version 2.2
and
<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="com.redknee.bssauto.helpers">
<Appenders>
<RollingFile name="Rolling-default" fileName="logs/bssauto.html"
filePattern="logs/$${date:yyyy-MM}/bssauto-%d{MM-dd-yyyy}-%i.log.gz">
<CustomHTMLLayout charset="UTF-8" title="BSSAuto Logs" locationInfo="true" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Rolling-default"/>
</Root>
</Loggers>
</Configuration>
Notice following
<Configuration packages="com.redknee.bssauto.helpers">
here packages should have all packages containing custom class for layouts
<CustomHTMLLayout charset="UTF-8" title="BSSAuto Logs" locationInfo="true" />
and CustomHTMLLayout is custom class created by extending AbstractStringLayout

Related

how to create log file under project base directory using log4j2

I wanted to create log file in my maven project under project base directory.I am using log4j2 framework kept the log4j2.xml file under src/mian/resources folder. below is the file. please update what is wrong in it.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns:xi="http://www.w3.org/2001/XInclude"
packages="com.viveo.rtcc.common.client.traces" status="WARN">
<Properties>
<Property name="log-path">appLogs</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<!-- <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36}
- %msg%n"/> -->
<PatternLayout pattern="[ %d ] %p %t %c : %m%n" />
</Console>
<RollingFile name="rollingFileAppender"
fileName="${log-path}/reLog.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d [%t] %p %c - %m%n</Pattern>
</PatternLayout>
<Policies>
<!-- <OnStartupTriggeringPolicy /> <TimeBasedTriggeringPolicy /> -->
<SizeBasedTriggeringPolicy size="10000 KB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
<MessageAreaAppender name="MessageAreaAppender" />
</Appenders>
<Loggers>
<!-- <Root level="DEBUG"> <AppenderRef ref="RollingFileAppender" /> <AppenderRef
ref="Console" />
<AppenderRef ref="MessageAreaAppender" /> </Root> -->
<Logger name="com.yourloggername" level="debug"
additivity="false">
<!-- <AppenderRef ref="ConsoleAppender" /> -->
<AppenderRef ref="rollingFileAppender" />
</Logger>
<Root level="info">
<!-- <AppenderRef ref="ConsoleAppender" /> -->
<AppenderRef ref="rollingFileAppender" />
</Root>
</Loggers>
</Configuration>
Here is what I see wrong in your configuration:
Maven builds run with the working directory set to the root directory of the project. Any files creates will be respective of that. In your configuration that means it would create the logs in a directory named appLogs. This is a poor practice in Maven builds. You should change it to target/applogs.
Your filePattern contains %d{dMM-dd-yy} but none of your triggering policies are time based. Without a time-based trigger I would expect that time to never changed while the application is running.

Cassandra Appender - How to Log ONLY error messages?

I am using Cassandra appender, console and file appenders in my application. I want to store only ERROR messages in Cassandra table Logs whereas store INFO messages to Console and file.
Below is the log4j2.xml file.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Properties>
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"</Property>
<Property name="APP_LOG_ROOT">./log</Property>
<Property name="MINLEVEL">INFO</Property>
<Property name="FILEMAXSIZE">800MB</Property>
<Property name="MAXFILES">5</Property>x
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<RollingFile name="ROLLING" fileName="${APP_LOG_ROOT}/abc.log"
filePattern="${APP_LOG_ROOT}/abc-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="${FILEMAXSIZE}" />
</Policies>
<DefaultRolloverStrategy max="${MAXFILES}"/>
</RollingFile>
<Cassandra name="Cassandra" clusterName="TestCluster" keyspace="Employee" table="Logs" bufferSize="10" username="tomcat" password="password">
<SocketAddress host="IPaddress" port="9042"/>
<ColumnMapping name="userid" pattern="%uuid{TIME}" type="java.util.UUID"/>
<ColumnMapping name="logger" pattern="%logger"/>
<ColumnMapping name="message" pattern="%message"/>
<ColumnMapping name="level" pattern="%level"/>
<ColumnMapping name="timestamp" literal="now()"/>
</Cassandra>
</Appenders>
<Loggers>
<Root level="${MINLEVEL}" additivity="false">
<AppenderRef ref="ROLLING"/>
</Root>
<Logger name="abc.xyz" level="ERROR" additivity="false">
<AppenderRef ref="Cassandra" />
<AppenderRef ref="console" />
</Logger>
</Loggers>
In the last segment when I change the level to ${MINLEVEL} i.e INFO, then it works but ERROR is not working. Please help!
The issue is that additivity is set to false, this is preventing to duplicate the messages to the root and abc.xyz loggers. If you set additivity to false, it will be sent to both loggers.
More information is available in this blog entry.

Stop log4j from logging into syslog

I am trying to configure log4j2 to write logs in several files using Routing & RollingFile appenders, and so far everything works well. However, there is an unwanted side effect - it also logs into Linux syslog. Is there any way to disable logging into syslog? Here is my log4j2.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration name="Staging" status="warn">
<Properties>
<Property name="pattern" value="%-5level [%d{DEFAULT}] %logger{30} %X %marker %msg%n"/>
<Property name="log-path" value="/var/log/application"/>
<Property name="file-size" value="200 MB"/>
<Property name="file-total" value="10"/>
</Properties>
<Appenders>
<RollingFile name="SESSIONS_APPENDER" fileName="${log-path}/sessions.log" filePattern="${log-path}/sessions-%i.log.gz" append="true">
<PatternLayout pattern="${pattern}"/>
<Policies>
<SizeBasedTriggeringPolicy size="${file-size}"/>
</Policies>
<DefaultRolloverStrategy max="${file-total}"/>
</RollingFile>
<RollingFile name="TRANSACTIONS_APPENDER" fileName="${log-path}/transactions.log" filePattern="${log-path}/transactions-%i.log.gz" append="true">
<PatternLayout pattern="${pattern}"/>
<Policies>
<SizeBasedTriggeringPolicy size="${file-size}"/>
</Policies>
<DefaultRolloverStrategy max="${file-total}"/>
</RollingFile>
<RollingFile name="STDROUT_APPENDER" fileName="${log-path}/stdrout.log" filePattern="${log-path}/stdrout-%i.log.gz" append="true">
<PatternLayout pattern="${pattern}"/>
<Policies>
<SizeBasedTriggeringPolicy size="${file-size}"/>
</Policies>
<DefaultRolloverStrategy max="${file-total}"/>
<!-- Filtering from the stdout log, lines that have their own custom appender -->
<Filters>
<MarkerFilter marker="TRANSACTION" onMatch="DENY" onMismatch="NEUTRAL"/>
<MarkerFilter marker="SESSION" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
</RollingFile>
<Routing>
<name>ROUTING_APPENDER</name>
<Routes>
<pattern>$${marker:}</pattern>
<!-- Default appender if no matching marker found -->
<Route ref="STDROUT_APPENDER"/>
<!-- Appender selection for specific marker -->
<Route key="TRANSACTION" ref="TRANSACTIONS_APPENDER"/>
<Route key="SESSION" ref="SESSIONS_APPENDER"/>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="STDROUT_APPENDER"/>
</Root>
<Logger name="com.application" level="info" additivity="false">
<AppenderRef ref="ROUTING_APPENDER"/>
</Logger>
<Logger name="org.apache" level="error">
<AppenderRef ref="STDROUT_APPENDER"/>
</Logger>
<Logger name="com.amazonaws" level="error">
<AppenderRef ref="STDROUT_APPENDER"/>
</Logger>
</Loggers>
</Configuration>

How to add uuid in log filename .I am using log4j2?

i want to create log filename which includes uuid in name .
<Configuration status="DEBUG">
<Appenders>
<RollingFile name="file" fileName="log/${uuid:TIME}-test.log"
append="true" filePattern="log/${uuid:TIME}-test.log.%i">
<Policies>
<SizeBasedTriggeringPolicy size="100 KB" />
</Policies>
<DefaultRolloverStrategy max="5" />
<PatternLayout>
<Pattern>%d %-5p [%c{3}] (%t) %m%n</Pattern>
</PatternLayout>
</RollingFile>
<Async name="async">
<AppenderRef ref="file" />
</Async>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p [%c{2}]%m%n" />
</Console>
</Appenders>
<Loggers>
<Root level="warn">
<AppenderRef ref="Console" />
<AppenderRef ref="async" />
</Root>
<Logger name="com.citigroup" level="INFO" additivity="false">
<Appender-ref ref="async" />
</Logger>
</Loggers>
</Configuration>
but it is creating file "uuid:TIME-test.log".I have also try %uuid , %u but none of them is creating file with uuid .
This can be accomplished with a custom lookup. This answer gives example code for how to create a custom lookup in Log4j2 (it's only a few lines of code).

limit the number of log files using log4j2 RollingFileAppender

I'm trying to limit the number of log files i maintain, using MaxBackupIndex but fail to achieve that. this is my log4j2.xml, i expected to log to a different log file every second but to rotate only between 2 files and not create more than that (or delete older ones):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="OGBackend" packages="">
<Properties>
<Property name="log-path">C:/logs/</Property>
</Properties>
<Parameters>
<param name="MaxBackupIndex" value="2"/>
</Parameters>
<Appenders>
<RollingFile name="RollingFile" fileName="${log-path}/myexample.log"
filePattern="${log-path}/myexample-%d{yyyy-MM-dd-HH-mm-ss}-%i.log">
<PatternLayout>
<pattern>%d{dd/MMM/yyyy HH:mm:ss}- %c{1}: %m%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy max="2"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="root" level="debug" additivity="false">
<appender-ref ref="RollingFile" level="debug"/>
</Logger>
<Root level="debug" additivity="false">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
any advice?
At the moment there is no official support for that sadly. What the max backup index(used with the %i lookup in file pattern) does is prevent more than 2 files per second rather than 2 files total.
https://issues.apache.org/jira/browse/LOG4J2-524
A link to a feature request about the same issue.

Resources