log4j日志级别怎么自定义?log4j日志级别配置实例

发布时间:2020-03-10编辑:脚本学堂
有关log4j日志级别的自定义方法,只输出所需的日志级别,可以定义一个log4j日志级别,可以参考下本文提供的实例。

开启log4j提供的INFO日志级别,每天生成的日志文件就会变得越来越大。
有时需要写个定时任务来删除这个文件。

为了只输出所需的日志级别,唯有自己定义一个log4j的级别,便于日志文件的灵活控制,而且不需要对之前的代码进行修改。

1、CustomerLog
 

复制代码 代码示例:
package common.log; 
import org.apache.log4j.Level; 
import org.apache.log4j.Logger; 
import org.apache.log4j.net.SyslogAppender; 
public class CustomerLog {
/**
 * 继承Level
 * @author Sevencm
 *
 */ 
private static class CustomerLogLevel extends Level{ 
public CustomerLogLevel(int level, String levelStr, int syslogEquivalent) { 
super(level, levelStr, syslogEquivalent); 
}

/**
 * 自定义级别名称,以及级别范围
 */ 
private static final Level CustomerLevel = new CustomerLogLevel(20050,"CUSTOMER",SyslogAppender.LOG_LOCAL0); 
/**
 * 使用日志打印logger中的log方法
 * 
 * @param logger
 * @param objLogInfo
 */ 
public static void customerLog(Logger logger,Object objLogInfo){ 
logger.log(CustomerLevel, objLogInfo); 

2、Log Filter
 

复制代码 代码示例:
package common.log; 
import org.apache.log4j.spi.Filter; 
import org.apache.log4j.spi.LoggingEvent; 
public class CustomerLogFilter extends Filter { 
boolean acceptOnMatch = false; 
private String levelMin; 
private String levelMax; 
public String getLevelMin() { 
return levelMin; 

 
public void setLevelMin(String levelMin) { 
this.levelMin = levelMin; 

 
public String getLevelMax() { 
return levelMax; 

 
public void setLevelMax(String levelMax) { 
this.levelMax = levelMax; 

 
public boolean isAcceptOnMatch() { 
return acceptOnMatch; 

 
public void setAcceptOnMatch(boolean acceptOnMatch) { 
this.acceptOnMatch = acceptOnMatch; 

 
@Override 
public int decide(LoggingEvent lgEvent) { 
int inputLevel = lgEvent.getLevel().toInt(); 
if(inputLevel>=getLevel(levelMin) && inputLevel <= getLevel(levelMax)){ 
return 0; 
}
return -1; 

private int getLevel(String level){ 
level = level.toUpperCase(); 
if(level.equals("CUSTOMER")){ 
return LevelType.CUSTOMER.getType(); 

if(level.equals("OFF")){ 
return LevelType.OFF.getType(); 

if(level.equals("FATAL")){ 
return LevelType.FATAL.getType(); 

if(level.equals("ERROR")){ 
return LevelType.ERROR.getType(); 

if(level.equals("INFO")){ 
return LevelType.INFO.getType(); 

if(level.equals("WARN")){ 
return LevelType.WARN.getType(); 

if(level.equals("DEBUG")){ 
return LevelType.DEBUG.getType(); 

if(level.equals("ALL")){ 
return LevelType.ALL.getType(); 

return LevelType.OFF.getType(); 

private static enum LevelType{ 
OFF(2147483647), 
FATAL(50000), 
ERROR(40000), 
WARN(30000), 
INFO(20000), 
DEBUG(10000), 
ALL(-2147483648), 
CUSTOMER(20050); 
int type; 
public int getType() { 
return type; 

private LevelType(int type) { 
this.type = type; 


3、配置文件的设置:
 

复制代码 代码示例:
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' > 
 
<appender name="Console" class="org.apache.log4j.ConsoleAppender"> 
<layout class="org.apache.log4j.PatternLayout"> 
<param name="ConversionPattern" value="%d [%p] %c{1} - %m%n" /> 
</layout> 
<!--过滤器设置输出的级别 --> 
<filter class="common.log.CustomerLogFilter"> 
<param name="levelMin" value="info" /> 
<param name="levelMax" value="Customer" /> 
<param name="AcceptOnMatch" value="true" /> 
</filter> 
</appender> 
<!-- 根logger的设置--> 
<root> 
<priority value ="INFO"/> 
<appender-ref ref="Console"/> 
</root> 
</log4j:configuration> 

4、测试类
 

复制代码 代码示例:
package common.test; 
import org.apache.log4j.Logger; 
import common.log.CustomerLog; 
public class Test { 
private static final Logger logger = Logger.getLogger("customer"); 
public static void main(String[] args) { 
CustomerLog.customerLog(logger, "自定义日志级别"); 
logger.info("哈哈哈哈"); 

5、运行结果:
2014-05-24 17:22:45,647 [CUSTOMER] customer - 自定义日志级别
2014-05-24 17:22:45,648 [INFO] customer - 哈哈哈哈

6、通过修改
<param name="levelMin" value="info" /> 
以上 Value 值用于控制日志输出级别。