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: 哼哼哼哼

Advertisements

你可能會喜歡