Basic Log
Log4j is a very common log library for Java, which can has most common features that we need:
- configure log target: file, console, network etc;
- configure log format: layout, pattern;
- configure log threshold;
Property File Config Example
The following is a sample config:
log4j.rootLogger=CONSOLE,E
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Threshold = Warn
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = logs/log_error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
Conditional Log
In some cases, we want to log some specific information, but filter out some others. One common way to do this is using different logging levels, which is the value of Threshold
. Log4j has five pre-defined levels:
- FATAL
- ERROR
- WARN
- INFO
- DEBUG
- TRACE
In some other cases, we shouldn’t use logging levels, but some finer granularity of control method. In this case, we can use filters to meet the needs.
Log4j has four common filters to filter the output:
- DenyAllFilter: drop all logging event
- LevelMatchFilter: a level to match and a boolean to decide whether accept this level
- LevelRangeFilter: a range to match and a boolean to decide whether accept this range
- StringMatchFilter: a string to match and a boolean to decide whether accept event that contains this string
A Wrong Example
The following is a wrong example I copy from web:
log4j.appender.X=...
// here, the name of logger is wrong, so not work
og4j.appender.x.filter.1=org.apache.log4j.varia.StringMatchFilter
log4j.appender.X.filter.1.StringToMatch=ErrorCodeException
log4j.appender.X.filter.1.AcceptOnMatch=false
What should be noticed here is the name of logger should match the following config, or filtering will fail.
PropertyConfigurator
If we find our config not working, we may need to find out whether our version of Log4j is right, whether those filters are exists in our version.
If it is still not work, we can find class PropertyConfigurator
in Log4j, which is used to parse property file and set up Log4j config.
The following is the part of code parse filters, through which, we find out the bug of upper config.
void parseAppenderFilters(Properties props, String appenderName, Appender appender) {
// property key, have to match the name of logger, or won't config filter
String key = (String) e.nextElement();
if (key.startsWith(filterPrefix)) {...}
}
StringMatchFilter
If we are still confused with how StringMatchFilter
works, we can read the code to find out:
int decide(LoggingEvent event) {
String msg = event.getRenderedMessage();
if(msg == null || stringToMatch == null)
return Filter.NEUTRAL;
if( msg.indexOf(stringToMatch) == -1 ) {
return Filter.NEUTRAL;
} else { // we've got a match
if(acceptOnMatch) {
return Filter.ACCEPT;
} else {
return Filter.DENY;
}
}
}
By reading the source of decide
, we can see, it will ignore this log message if contains specific string, because the use of indexOf
.
Written with StackEdit.
评论
发表评论