您的位置:首页 > 其它

log4j自定义级别并分类输出到文件

2017-04-29 11:47 435 查看
       背景介绍:为service中的每个方法进行日志记录,记录方法执行时间以及方法名、方法用途、返回结果等。记录工具采用了log4j,并自定义级别,然后分类输出到文件中。

首先,自定义log4j级别:

public class ServiceLog {
private static Logger logger = Logger.getLogger(ServiceLog.class);
// 定义级别
private static class ServiceLogLevel extends Level {

private static final long serialVersionUID = 1L;

private ServiceLogLevel(int level, String name, int sysLogLevel) {
super(level, name, sysLogLevel);
}
}
// 20050级别数,"SERVICELOG":级别名称
private static final Level SERVICE_LOG_LEVEL = new ServiceLogLevel(20050, "SERVICELOG",
SyslogAppender.LOG_LOCAL0);

// 使用时调用方法
public static void serviceLogger(Object pm_objLogInfo) {
logger.log(SERVICE_LOG_LEVEL, pm_objLogInfo);
}
}


     定义过滤器:

public class ServiceLogFilter 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("SERVICELOG")) {
return LevelType.SERVICELOG.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),

SERVICELOG(20050);

int type;

public int getType() {
return type;
}

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


配置文件log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 输出日志到控制台 ConsoleAppender -->
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="DEBUG"></param>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss} -%t] %c:%L%n%m%n"></param>
</layout>
</appender>

<!-- 记录info信息 每天一个文件 -->
<appender name="info" class="org.apache.log4j.DailyRollingFileAppender">
<param name="DatePattern" value="'_'yyyy-MM-dd'.log'"></param>
<param name="File" value="D:/Servers/logs/log_info"></param>
<param name="Encoding" value="UTF-8"></param>
<param name="Append" value="true"></param>
<param name="Threshold" value="INFO"></param>

<filter class="com.cisdi.tool.serviceLog.ServiceLogFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>

<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss} -%t] %c:%L%n%m%n"></param>
</layout>
</appender>

<!-- 记录错误信息 文件大小到达指定尺寸的时候产生一个新的文件 -->
<appender name="error" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="D:/Servers/logs/log_error"></param>
<param name="DatePattern" value="'_'yyyy-MM-dd'.log'"/>
<param name="Append" value="true"></param>
<param name="Threshold" value="ERROR"></param>
<param name="MaxFileSize" value="2000KB"></param>
<param name="Encoding" value="UTF-8"></param>
<filter class="com.cisdi.tool.serviceLog.ServiceLogFilter">
<param name="LevelMin" value="Error" />
<param name="LevelMax" value="Error" />
</filter>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss} -%t] %c:%L%n%m%n"></param>
</layout>
</appender>

<!-- 自定义日志,用来记录service操作记录 -->
<appender name="serviceLog" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="D:/Servers/logs/serviceLog"></param>
<param name="DatePattern" value="'_'yyyy-MM-dd"></param>
<param name="Encoding" value="UTF-8"></param>
<param name="Append" value="true"></param>
<param name="Threshold" value="SERVICELOG"></param>
<filter class="com.cisdi.tool.serviceLog.ServiceLogFilter">
<param name="LevelMin" value="SERVICELOG" />
<param name="LevelMax" value="SERVICELOG" />
</filter>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %m%n%n"></param>
</layout>
</appender>

<!--
定义全局的日志输出级别,但是在输出目的地的配置中配置的具体输出级别优先级高于全局定义的优先级。
如果在railyFile中定义<param name="Threshold" value="info"></param>,那么将会把info以上级别的信息输出
-->
<root>
<priority value="info" />
<appender-ref ref="stdout" />
<appender-ref ref="info" />
<appender-ref ref="error" />
<appender-ref ref="serviceLog" />
</root>

</log4j:configuration>

配置文件的使用,需要在web.xml中配置使用(由于笔者使用时,采用的java web项目)

<!-- log4j 系统日志-->

<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:config/log4j.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>


关于自定义的日志级别具体使用请参见另一篇文章《AOP实现方法的日志记录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息