We're experiencing some stoppages on our log4j(v1.2.8) INFO logs. We're using a WebSphere(8.5.5) clustered server(vertical) with 3 members that runs on a single machine(UNIX). Stoppage is random; no specific file size, time or when about to rollover
We've first suspected that is a volume related problem as we've tested before on a lower volumed server the problem doesn't occur. I've later tested overloading this server but I could not replicate the problem.
Average daily production is 175,000 INFO lines. A workaround is available by just changing the timestamp of the log files to resume logging.
Already looked into the suggested fix on Log4j suddenly stops logging but nothing seemed to work. I'm hoping I could get some advise on were to look. Thank you.
log4j.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<root>
<priority value="INFO" />
<appender-ref ref="TEST" />
</root>
<appender name="TEST" class="org.apache.log4j.RollingFileAppender">
<param name="encoding" value="UTF-8" />
<param name="file" value="$test/directory/logs/test${com.test.log.server.name}.log" />
<param name="MaxFileSize" value="10000KB" />
<param name="MaxBackupIndex" value="50" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%t] [%-12X{username}] [%-12X{servlet}] [%c{1}] %m%n" />
</layout>
</appender>
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{1} - %m%n" />
</layout>
</appender>
</log4j:configuration>
The value of ${com.test.log.server.name} is declared in WebSphere JVM custom properties on each application server.
Any help would be greatly appreciated.
Related
I have a problem.
Log4j dont want write to console and to file with system variable in path. Only write to file with simple path.
Configuration of my log4j.
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
<!-- <param name="file" value="d:/lv-098_JAVA/logs/log.log" /> -->
<param name="file" value="${LV098_JAVA}/src/main/resources/logs/log.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p (%F:%L:%M) %c{1} %m%n" />
</layout>
<!-- Root Logger -->
<root>
<priority value="info" />
<appender-ref ref="file1" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
You are declaring
appender name="file" class="org.apache.log4j.DailyRollingFileAppender"
and in root tag you write
appender-ref ref="file1"
As there is no such file1. Due to this log4j is not working for you.
I found where problem is. It is in Jboss, because jboss have his own logger and it doesn't allow to write to console. You must change configuration of Jboss logger. But I don't know why it does not allow to use system variable.
I am using org.apache.log4j.rolling.RollingFileAppender to generate daily logs.
It generates daily logs in windows, but it is not generating logs in linux.
Help is greatly appreciated!
Below is the log4j.xml file:
<param name="append" value="true" />
<param name="encoding" value="UTF-8" />
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="D:/source/logs/passports.log.%d{yyyy-MM-dd}.log"/>
</rollingPolicy>
<layout class="org.apache.log4j.PatternLayout">
<!-- The log message pattern -->
<param name="ConversionPattern" value="%d [%t] %-5p {%c} %m%n" />
</layout>
<root>
<priority value="info,debug,error" />
<appender-ref ref="ROLL" />
</root>
Your FileNamePattern needs to reflect the location of the file, specific to the server/workstation the application is running in.
In the snippet you gave, I see that the value for FileNamePattern is D:/source/logs/passports.log.%d{yyyy-MM-dd}.log.
The "D:" suggests to me that this is for your windows box.
Replace this value with the location that your linux box would hold the log file, for example: /var/source/logs/passports.log.%d{yyyy-MM-dd}.log
I have this log4j.xml file which should only log from INFO Level
but i was also getting the WARN Level also in my log .
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender class="org.apache.log4j.RollingFileAppender" name="FILE">
<param value="D:\\RAM\\tst.log" name="File" />
<param value="10" name="MaxBackupIndex" />
<param value="200MB" name="MaxFileSize" />
<layout class="org.apache.log4j.PatternLayout">
<param value="%d[%t] %-5p(%F:<%M>:%L)- %m%n" name="ConversionPattern" />
</layout>
</appender>
<appender class="com.Log4JCustomAppender" name="CUSTAPPEN">
<layout class="org.apache.log4j.PatternLayout">
<param value="%d[%t] %-5p(%F:<%M>:%L)- %m%n" name="ConversionPattern" />
</layout>
</appender>
<appender class="org.apache.log4j.AsyncAppender" name="ASYNC">
<param name="Blocking" value="false"/>
<param name="BufferSize" value="1000"/>
<appender-ref ref="CUSTAPPEN" />
</appender>
<root>
<level value="INFO" />
<appender-ref ref="FILE" />
<appender-ref ref="ASYNC" />
</root>
</log4j:configuration>
This is the output i was getting in my Custom Appender and RollingFileAppender
LOgged One is 2013-06-23 01:05:55,954[main] FATAL(Hi.java:<main>:14)- This is a fatal Message
LOgged One is 2013-06-23 01:05:55,965[main] WARN (Hi.java:<main>:15)- This is a warn Message
please tell me how to avoid this .
This behavior is normal. Setting a logger to a specific level value indicates that you want that level AND all level above.
Levels are :
TRACE
DEBUG
INFO
WARN
ERROR
FATAL
OFF
If you want only the INFO level, you have to use filters on your appenders :
<filter type="org.apache.log4j.varia.LevelMatchFilter">
<acceptOnMatch value="true" />
<levelToMatch value="INFO" />
</filter>
<filter type="org.apache.log4j.varia.DenyAllFilter" />
I have a class which events I want to log. Say, there are 2 levels: debug and error. How can I log errors to an errorFile and debug info to a debugFile?
So that I use log4j.xml there is a filter mechanism, but it seems to work only for different categories not inside one class.
Please, help to newbie. =)
You have to define and use two appender with different Threshold like this:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Error -->
<appender name="ErrorFile"
class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="error"/>
<param name="file" value="log.err" />
<param name="MaxFileSize" value="10MB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d %C.%M (%L) - %m%n" />
</layout>
</appender>
<appender name="LogFile"
class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="debug"/>
<param name="file" value="log.log" />
<param name="MaxFileSize" value="10MB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d %C.%M (%L) - %m%n" />
</layout>
</appender>
<logger name="foo.bar" additivity="false">
<level value="debug" />
<appender-ref ref="LogFile" />
<appender-ref ref="ErrorFile" />
</logger>
<root>
<priority value="warn" />
<appender-ref ref="ErrorFile"/>
</root>
</log4j:configuration>
This question is also answered in the log4j FAQs.
Just found the LogToAppenderByLevel solution (here) which may be also helpful for you.
I've set up a logfileAppender and a consoleAppender in my log4net config for my application. I would like the logfile appender to only write ERROR messages and above and the console appender to write DEBUG and above.
My config is:
<log4net debug="false">
<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
<param name="File" value="log.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d %M - %m%n" />
</layout>
<threshold value="ERROR"/>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d %m%n" />
</layout>
</appender>
<root>
<priority value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="LogFileAppender" />
</root>
</log4net>
I'm finding that both ERROR and DEBUG is being output to my logfile appender. How to restrict it to only ERROR?
Note also that the level tag in the logger doesn't work the same way as threshold or a LevelMatchFilter.
Level indicates what log statements that actually will be generated. This is what you can test on in you code.
Threshold on the other hand, filters away all log messages that falls below your threshold.
This means that having a threshold that is higher than the highest logger level makes no sense. I have seen many times how one sets a level of INFO (because that is what most appenders will use), and then create an appender that has a threshold of DEBUG. And then you are surprised when no DEBUG messages actually appears on the appender...
To get very specific filtering for an appender, you need to configure a LevelMatchFilter or a LevelRangeFilter for the logfile appender to filter the events which are actually output.
For example:
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR"/>
<levelMax value="FATAL"/>
</filter>
or
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="ERROR"/>
</filter>
put one of these inside your <appender> tag, and this should work for you:
<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="ERROR"/>
</filter>
<param name="File" value="log.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d %M - %m%n" />
</layout>
<threshold value="ERROR"/>
</appender>
Note: Updated to remove mistake pointed out by kgiannakakis.
I've created a sample console application using your log4net config and I'm getting the exact behaviour you appear to be wanting....
using System;
using System.IO;
using log4net;
using log4net.Config;
namespace SO_1171258
{
class Program
{
private static readonly ILog log = LogManager.GetLogger(typeof(Program));
static void Main()
{
XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString()));
log.Error(new Exception("error log statment"));
log.Debug("debug log statment");
}
}
}
When I run this application, the only thing in the logfile is:
2014-01-27 15:02:51,387 Main - System.Exception: error log statment
And to the screen I see:
2014-01-27 15:05:52,190 System.Exception: error log statment
2014-01-27 15:05:52,218 debug log statment
Here is the entirety of my app.config file:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net debug="false">
<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
<param name="File" value="log.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d %M - %m%n" />
</layout>
<threshold value="ERROR"/>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d %m%n" />
</layout>
</appender>
<root>
<priority value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="LogFileAppender" />
</root>
</log4net>
</configuration>
The answers you are receiving are partly correct. The Threshold is only used to set a lower limit on the level appended. A threshold of ERROR will actually receive ERROR and FATAL (which is "above" ERROR).
You do want to implement a LevelMatchFilter with a level value of "ERROR" (and "DEBUG" for the other appender). However, you must also add a DenyAllFilter to the end of your filter chain.
For example:
<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
<param name="File" value="log.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d %M - %m%n" />
</layout>
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="ERROR" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
</appender>
I've had to implement the DenyAllFilter since log4net 1.2.10 (you can see the question I had on this topic here).
You need to use additivity property. See here for an example. You need to define two loggers.