log4j自定義分級過濾日誌
1.StormLog代碼如下
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.net.SyslogAppender;
public class StormLog {
/**
* 繼承Level
*/
private static class StormLogLevel extends Level{
public StormLogLevel(int level, String levelStr, int syslogEquivalent) {
super(level, levelStr, syslogEquivalent);
Advertisements
}
}
/**
* 自定義級別名稱,以及級別範圍
*/
private static final Level CustomerLevel = new StormLogLevel(20050,"STORM",SyslogAppender.LOG_LOCAL0);
/**
* 使用日誌列印logger中的log方法
*
*/
public static void stormLog(Logger logger,Object objLogInfo){
logger.log(CustomerLevel, objLogInfo);
}
}
2.Log Filter代碼如下:
import org.apache.log4j.spi.Filter;
Advertisements
import org.apache.log4j.spi.LoggingEvent;
public class StormLogFilter 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.log4j.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<!--輸出方式說明-->
<!--Log4j提供的appender有以下幾種:-->
<!--org.apache.log4j.ConsoleAppender(控制台)-->
<!--org.apache.log4j.FileAppender(文件)-->
<!--org.apache.log4j. RollingFileAppender (滾動文件,自動記錄最新日誌)-->
<!--org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件)-->
<!--配置日誌信息的格式-->
<!--org.apache.log4j.PatternLayout(可以靈活地指定布局模式)-->
<appender name="storminfo" class="org.apache.log4j.DailyRollingFileAppender">
<!-- 設置File參數:日誌輸出文件名 -->
<param name="File" value="e://logs/info"/>
<!--設置是否在重新啟動服務時,在原有日誌的基礎添加新日誌-->
<param name="Append" value="true" />
<!--設置前一天的日誌名稱格式,原有名稱追加以下格式-->
<param name="DatePattern" value="'_'yyyy-MM-dd'.log'" />
<!-- 設置輸出文件項目和格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%p] %c{1} - %m%n" />
</layout>
<!--過濾器設置輸出的級別 -->
<filter class="cn.com.bonc.log4j.StormLogFilter">
<param name="levelMin" value="Storm" />
<param name="levelMax" value="ERROR" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!-- 輸出日誌文件 每天一個日誌 -->
<appender name="stormerror" class="org.apache.log4j.DailyRollingFileAppender">
<!-- 每天輸出日誌的路徑 -->
<param name="File" value="e://logs/error"/>
<!-- 前一天日誌的追加後綴 -->
<param name="DatePattern" value="'_'yyyy-MM-dd'.log'" />
<param name="Append" value="true" />
<!-- 設置輸出文件項目和格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%p] %c{1} - %m%n" />
</layout>
<!--過濾器設置輸出的級別 -->
<filter class="cn.com.bonc.log4j.StormLogFilter">
<!--levelMin和levelMax可以不一樣 -->
<param name="levelMin" value="ERROR" />
<param name="levelMax" value="ERROR" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!-- <!--輸出到控制台中-->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
<!--兩種輸出格式都可以 -->
value="%d{yyyy-MM-dd } %-5p: %m%n" />
<!--value="%-5p: [%t] [%c{3}.%M(%L)] | %m%n"/>-->
</layout>
</appender> -->
<!-- 根logger的設置-->
<root>
<priority value ="INFO"/>
<!--定義root logger的輸出目的地-->
<!-- <appender-ref ref="console"/>(如果想在控制台中輸出請打開) -->
<appender-ref ref="storminfo"/>
<appender-ref ref="stormerror"/>
</root>
</log4j:configuration>
4.測試類Test代碼如下:
import org.apache.log4j.Logger;
public class Test {
private static final Logger logger = Logger.getLogger("storm");
public static void main(String[] args) {
StormLog.stormLog(logger, "自定義日誌級別");
logger.info("哈哈哈哈");
logger.error("哼哼哼哼");
}
}
5.運行結果如下:
2017-03-14 STORM: 自定義日誌級別
2017-03-14 INFO : 哈哈哈哈
2017-03-14 ERROR: 哼哼哼哼