How to write different log levels into different rolling files in log4j2 - log4j2

I have a log4j2.xml as follows:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<Property name="dir" value="/var/log/sunverge" />
<Property name="file" value="maggie.log" />
<Property name="eatonemcbfile" value="eaton.log" />
</Properties>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d{ISO8601} %5p [%t] %c - %m%n" />
</Console>
<RollingFile name="file" fileName="${dir}/${file}"
filePattern="${dir}/${file}.%d{yyyy-MM-dd}">
<PatternLayout>
<Pattern>%d{ISO8601} %5p [%t] %c - %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
</Policies>
</RollingFile>
<RollingFile name="eaton"
fileName="${dir}/${eatonemcbfile}"
filePattern="${dir}/${eatonemcbfile}.%d{yyyy-MM-dd}">
<PatternLayout>
<Pattern name="ConversionPattern"> %d{ISO8601} %5p [%t] %c - %m%n</Pattern>
</PatternLayout>
<ThresholdFilter level="debug"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="warn">
<AppenderRef ref="file" />
</Root>
<logger name="com.sunverge.devices.eaton.emcb" level="info">
<AppenderRef ref="eaton" />
<AppenderRef ref="file" />
</logger>
</Loggers>
</Configuration>
So however, I set the threshold for the eaton.log to be debug but both of them log the debug level. For some reason I don't want to add add the ThresholdFilter tag for the other file. Any help appreciated.

You should not be getting debug logs to any of your files as none of your loggers is configured to accept debug messages. If you are seeing them in the file then this configuration is not being used. You can verify whether it is being used or not by adding status="debug" to the configuration element and looking at what Log4j is configuring. If you don't see log4j debug output then that is a clear sign the configuration file is not being used. You can also add -Dlog4j2.debug=true to the command line which will cause the log4j logs to be output. You can inspect that to see where the configuration is coming from.
I would recommend changing your configuration to:
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d{ISO8601} %5p [%t] %c - %m%n" />
</Console>
<RollingFile name="file" fileName="${dir}/${file}"
filePattern="${dir}/${file}.%d{yyyy-MM-dd}">
<PatternLayout>
<Pattern>%d{ISO8601} %5p [%t] %c - %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
</Policies>
</RollingFile>
<RollingFile name="eaton"
fileName="${dir}/${eatonemcbfile}"
filePattern="${dir}/${eatonemcbfile}.%d{yyyy-MM-dd}">
<PatternLayout>
<Pattern name="ConversionPattern"> %d{ISO8601} %5p [%t] %c - %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="warn">
<AppenderRef ref="file" />
</Root>
<logger name="com.sunverge.devices.eaton.emcb" level="debug" additivity="false">
<AppenderRef ref="eaton" level="debug"/>
<AppenderRef ref="file" level="info"/>
</logger>
</Loggers>
</Configuration>

Related

Log File is not creating for RegexFilter in Log4j2.xml

I am using below config file to generate log files .
details are given below, I can see only GoCreditDL.log is generating in Unix server after deployment.
there is no error regarding Data.log.
I have tested it my local machine its working fine, but on Unix server I am getting only one logs.
Not sure Regex filter is not working in Unix Env.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<Properties>
<Property name="LOG_PATTERN">%d{dd MMM yyyy HH:mm:ss.SSS} %5p [%t] (%F:%L) - %m%n</Property>
<Property name="FILE_PATTERN">%d{yyyy-MM-dd-HH}-%i.log</Property>
<Property name="APP_LOG_ROOT">/home/gocredit2/gocredit_DL/log</Property>
<Property name="FILE_PATTERN_PATH">logs/$${date:yyyy-MM-dd}</Property>
<Property name="INTERVAL">1</Property>
<Property name="SIZE10MB">10 MB</Property>
<Property name="SIZE20MB">20 MB</Property>
<Property name="RolloverStrategy">10</Property>
</Properties>
<Appenders>
<RollingFile name="EJBGoCreditLog" fileName="${APP_LOG_ROOT}/GoCreditDL.log"
filePattern="${FILE_PATTERN_PATH}/GoCreditDL-${FILE_PATTERN}">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="${INTERVAL}" modulate="true" />
<SizeBasedTriggeringPolicy size="${SIZE20MB}"/>
</Policies>
<DefaultRolloverStrategy max="${RolloverStrategy}"/>
</RollingFile>
<RollingFile name="Stored" fileName="${APP_LOG_ROOT}/Data.log"
filePattern="${FILE_PATTERN_PATH}/Data-${FILE_PATTERN}">
<PatternLayout>
<Pattern>${LOG_PATTERN} </Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="${INTERVAL}" modulate="true" />
<SizeBasedTriggeringPolicy size="${SIZE20MB}"/>
</Policies>
<DefaultRolloverStrategy max="${RolloverStrategy}"/>
<RegexFilter regex=".*Stored.*" onMatch="ACCEPT" onMismatch="DENY"/>
</RollingFile>
</Appenders>
<Loggers>
<root level="INFO">
<appender-ref ref="Stored" level="INFO"/>
<appender-ref ref="EJBGoCreditLog" level="INFO"/>
</root>
</Loggers>
</configuration>

Personalize RegexFilter in log4j2 for an xml file

despite the various posts found with the various solutions I can't solve a problem.
I am using Eclipse for a project and I would like only logs containing a certain expression / word to appear in a given log file.
For the configuration of log4j2 I am using an xml file
appenders files are different
below the xml file
<Properties>
<Property name="path">./LOGS</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout>
<pattern> %d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n </pattern>
</PatternLayout>
</Console>
<RollingFile name="Log"
fileName="${path}/log.txt" immediateFlush="false" append="true"
filePattern="${path}/log-%d{yyyy-MM-dd}-%i.txt">
fileIndex = min
<PatternLayout>
<pattern> %d{yyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n </pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="40" />
</RollingFile>
<RollingFile name="LogScarti"
fileName="${path}/log_scarti.txt" immediateFlush="false" append="true"
filePattern="${path}/log_scarti-%d{yyyy-MM-dd}-%i.txt">
<PatternLayout>
<pattern> %d{yyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n </pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="40" />
</RollingFile>
<RollingFile name="Performance"
fileName="${path}/Performance.txt" immediateFlush="false" append="true"
filePattern="${path}/Performance-%d{yyyy-MM-dd}-%i.txt">
<Filters>
<RegexFilter regex=".*common.utils.PerformanceMonitor.*" onMatch="DENY" onMismatch="ACCEPT"/>
</Filters>
<PatternLayout>
<pattern> %d{yyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n </pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="40" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="Log" level="Info"/>
<AppenderRef ref="LogScarti" level="Error" />
<AppenderRef ref="Performance" level="Info" />
</Root>
</Loggers>
Nothing is recorded in the Performance file and if I play with the accept / deny parameters, it writes everything to me as in the logs file.
I hope I have correctly illustrated the problem
thanks to those who will dedicate even just a minute of their time
The RegexFilter only filters the content of the log message (the %m pattern converter), whereas you are apparently trying to filter by logger name.
To filter by logger name you just need to attach your appender to the correct logger configuration:
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="Log" level="Info"/>
<AppenderRef ref="LogScarti" level="Error" />
</Root>
<Logger name="com.accenture.etl.bollini.common.utils.PerformanceMonitor"
level=info>
<AppenderRef ref="Performance" />
</Logger>
</Loggers>

log4j2 configuration empty log files

the following log4j2 configuration always results in empty log files and everything getting written to console. I don't want anything on the console except for the errors. Could you please help me give a hint on where I am going wrong?
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="TRACE" name="MyApp">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH-mm}-%i.log" immediateFlush="true">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="60"/>
<SizeBasedTriggeringPolicy size="950 MB"/>
</Policies>
</RollingFile>
<RollingFile name="DataRollingFile" fileName="logs/data.log"
filePattern="logs/completed/data-%d{yyyy-MM-dd-HH-mm}-%i.log" immediateFlush="true">
<PatternLayout>
<Pattern>%m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="60"/>
<SizeBasedTriggeringPolicy size="250 MB"/>
</Policies>
</RollingFile>
<!--<Console name="Console" target="SYSTEM_OUT">-->
<!--<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>-->
<!--</Console>-->
</Appenders>
<Loggers>
<Logger name="com.myapp.xdf.mimic" level="WARN"/>
<Logger name="org.springframework" level="ERROR"/>
<Logger name="com.myapp.xdf.mimic.adapter.DataWriter" level="WARN" additivity="false">
<AppenderRef ref="DataRollingFile"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
Your configuration has the Console appender commented out so it shouldn't be possible to have any logs directed to it. Are you sure your configuration is being read? Since you have trace enabled you should see logs generated when it is processed.

Two patterns in same log file is not working in log4j2

I'd like to configure log4j 2 with two different patterns in same appender. i.e., Whenever there is an error, a specific pattern should be present in the log file. I am not trying two different log files, but two different pattern in same log file. Whenever there is an error, I would see "MYDOMAINDOTCOM_SUPPORT_NEEDED" and this string will trigger an automatic email to support team.
I have the below configuration which prints error message in "RollingFile" appender only and "RollingFileError" appender is ignored. What am I missing ?
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Properties>
<Property name="log-path">/documents/log</Property>
</Properties>
<Appenders>
<RollingFile name="RollingFile" fileName="${log-path}/myexample.log"
filePattern="${log-path}/$${date:yyyy-MM}/myexample-%d{yyyy-MM-dd}-%i.log"
immediateFlush="true">
<PatternLayout>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %X{packetRefId} - %msg%n</pattern>
<!-- %d{dd/MMM/yyyy HH:mm:ss,SSS}- %c{1}: %m%n -->
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="100 KB" />
</Policies>
<DefaultRolloverStrategy max="4" />
</RollingFile>
<RollingFile name="RollingFileError" fileName="${log-path}/myexample.log"
filePattern="${log-path}/$${date:yyyy-MM}/myexample-%d{yyyy-MM-dd}-%i.log"
immediateFlush="true">
<param name="threshold" value="error" />
<PatternLayout>
<pattern>MYDOMAINDOTCOM_SUPPORT_NEEDED %d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %X{packetRefId} - %msg%n</pattern>
<!-- %d{dd/MMM/yyyy HH:mm:ss,SSS}- %c{1}: %m%n -->
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="100 KB" />
</Policies>
<DefaultRolloverStrategy max="4" />
</RollingFile>
</Appenders>
<Loggers>
<Logger name="org.springframework.beans.factory" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="root" level="debug" additivity="false">
<appender-ref ref="RollingFile" level="debug" />
<appender-ref ref="RollingFileError" level="error" />
</Logger>
<Root level="debug" additivity="false">
<AppenderRef ref="RollingFile" />
</Root>
</Loggers>
</Configuration>
You should never configure two appenders to write to the same file. Having two rolling file appenders that both use the same file and roll over to the same file pattern is never going to work correctly.
Also, your configuration would end up with all error messages being logged twice; once with the RollingFile appender due to its debug level, and once on the RollingFileError appender due to its error level.
Instead, you should have a single rolling file appender and use a PatternSelector to decide which pattern to use. See http://logging.apache.org/log4j/2.x/manual/layouts.html#Pattern_Selectors for documentation on pattern selectors.

log4j2 RollingFile Appender requires date pattern

I have defined a RollingFile Appender in log4j2
<RollingFile name="Locserver" append="true" fileName="locserver.log" filePattern="locserver-%i.log">
<PatternLayout>
<pattern>%d{ISO8601} [%t] %p %c %L - %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="50 MB"></SizeBasedTriggeringPolicy>
<DefaultRolloverStrategy>10</DefaultRolloverStrategy>
</Policies>
</RollingFile>
However when I try to run this I get an error
IllegalStateException : Pattern does not contain a date at
org.apache.logging.log4j.core.appender.rolling.PatternProcessor.getNExtTime(PatternProcessor.java:91)
This goes away as soon as I put a date pattern in filePattern for example, locserver-%d{MM-dd-yyyy}-%i.log. But I dont want the date in the log names. Is a bug or something wrong with my config?
In RollingFile appender,TimeBasedTrigerringPolicy checks for datepattern in filepattern attribute of tag. Specifing datepattern is then mandatory when using TimeBasedTrigerringPolicy.
Place %d{...} containing a SimpleDate Pattern in filePattern, e.g.:
<Appenders>
<RollingFile name="RollingFile" fileName="logs/rpi_gpio_latest.log"
filePattern="logs/**%d{yyyy-MM-dd_HH}**_rpi_gpio_%i.log">
<PatternLayout>
<Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="4 MB"/>
</Policies>
<DefaultRolloverStrategy fileIndex="max"/>
</RollingFile>
</Appenders>
Thanks Joe.
I finally figured it out.
I had an empty TimeBasedTriggeringPolicy tag within my Policies list which was forcing the date check in the filePattern. Once I removed it, it started working fine.
For me, that works like described here (using log4j 2.0-beta9 & Java 1.7).
My log4j.xml (size-policy set to 1kB just for testing):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
</Console>
<RollingFile name="Logfile"
fileName="Log/App.log"
filePattern="Log/App-%i.log">
<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="1 KB"/>
</Policies>
<DefaultRolloverStrategy max="4"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="Logfile"/>
</Root>
</Loggers>
</Configuration>
And it also works when using your config fragment (I'd just corrected the DefaultRolloverStrategy-setting):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
</Console>
<RollingFile name="Locserver"
append="true"
fileName="locserver.log"
filePattern="locserver-%i.log">
<PatternLayout>
<pattern>%d{ISO8601} [%t] %p %c %L - %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="50 MB"></SizeBasedTriggeringPolicy>
</Policies>
<DefaultRolloverStrategy max="4"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="eeo.tts" level="debug"/>
<Root level="info">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="Locserver"/>
</Root>
</Loggers>
</Configuration>
Which Version of log4j2 are you using?

Resources