您的位置:首页 > 其它

log4j自定义分级过滤日志

2017-05-02 13:01 393 查看
陆小凤一笑 2017-05-02 02:04

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);

}

}

/**

* 自定义级别名称,以及级别范围

*/

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;

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: 哼哼哼哼
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: