
背景介绍: 记录服务中每个方法的记录,记录方法执行时间和方法名称,方法用法日志分类学生,返回结果等. 日志记录工具使用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实现方法的日志记录”
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-264194-1.html
呵呵土豪来炫富了
中国食品生产赃乱差
事物的本质要用心灵才能看见