web开发中,当项目开发完毕后,可能会有些bug存在,程序出现bug后,如何快速定位并修改,就需要对这些程序的运行过程做一个记录,并保存起来,以便维护。
常用的是使用log4j框架,通过自定义日志级别,然后在代码中打下日志。
首先,写一个工具类LogUtil:
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.net.SyslogAppender;
/**
* 自定义级别日志定义log方法
*/
public class LogUtil {
// 自定义等级
private static final Level CUSTOM_LEVEL = new CustomLevel(25000, "CUSTOM",
SyslogAppender.LOG_LOCAL0);
// 单例模式
private static LogUtil logUtil = new LogUtil();
private LogUtil() {
}
private static Logger loggerCustom = null;
public static LogUtil getLogUtil(Object message) {
loggerCustom = Logger.getLogger(message.toString().substring(6));
return logUtil;
}
public void customLog(Object message) {
loggerCustom.log(CUSTOM_LEVEL, message);
}
}
然后,自定义一个日志级别过滤器CustomLogFilter:
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;
/**
* 自定义日志级别过滤器
*
*/
public class CustomLogFilter extends Filter {
boolean acceptOnMatch;
int levelMin;
int levelMax;
public int getLevelMin() {
return levelMin;
}
public void setLevelMin(int levelMin) {
this.levelMin = levelMin;
}
public int getLevelMax() {
return levelMax;
}
public void setLevelMax(int 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 >= levelMin && inputLevel <= levelMax) {
return 0;
}
return -1;
}
}
之后,自定义一个日志级别类,CustomLevel:
import org.apache.log4j.Level;
/**
*
* 自定义Custom级别
*
*/
public class CustomLevel extends Level {
private static final long serialVersionUID = 1L;
public CustomLevel(int level, String levelStr, int syslogEquivalent) {
super(level, levelStr, syslogEquivalent);
}
}
最后,在log4j.xml中配置如下信息:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<!-- 输出到控制台 -->
<appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
<!-- 输出格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p] [%d{yyyy年MM月dd日 HH:mm:ss,SSS\}] %c - %m%n" />
</layout>
<!--过滤器设置输出的级别 -->
<filter class="com.telek.utils.CustomLogFilter">
<param name="levelMin" value="25000" />
<param name="levelMax" value="25000" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!-- 输出到指定文件 -->
<appender name="Info" class="org.apache.log4j.RollingFileAppender">
<param name="File"
value="E:/WorkspaceForJava/UsedMallMinaServer/WebRoot/log/info.log" /><!--
设置日志输出文件名 -->
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p] [%d{HH:mm:ss}] %c - %m%n" />
</layout>
<!-- 过滤级别为只有info信息 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="INFO" />
<param name="levelMax" value="INFO" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<appender name="Debug" class="org.apache.log4j.RollingFileAppender">
<param name="File"
value="E:/WorkspaceForJava/UsedMallMinaServer/WebRoot/log/debug.log" /><!--
设置日志输出文件名 -->
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p] [%d{yyyy年MM月dd日 HH:mm:ss}] %c - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="DEBUG" />
<param name="levelMax" value="DEBUG" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<appender name="Warn" class="org.apache.log4j.RollingFileAppender">
<param name="File"
value="E:/WorkspaceForJava/UsedMallMinaServer/WebRoot/log/warn.log" /><!--
设置日志输出文件名 -->
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p] [%d{yyyy年MM月dd日 HH:mm:ss}] %c - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="WARN" />
<param name="levelMax" value="WARN" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<appender name="Error" class="org.apache.log4j.RollingFileAppender">
<param name="File"
value="E:/WorkspaceForJava/UsedMallMinaServer/WebRoot/log/error.log" /><!--
设置日志输出文件名 -->
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p] [%d{yyyy年MM月dd日 HH:mm:ss}] %c - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="ERROR" />
<param name="levelMax" value="ERROR" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<appender name="MinaCustom" class="org.apache.log4j.RollingFileAppender">
<param name="File"
value="E:/WorkspaceForJava/UsedMallMinaServer/WebRoot/log/custom.log" />
<!--设置日志输出文件名 -->
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p] [%d{yyyy年MM月dd日 HH:mm:ss,SSS\}] - %m%n" />
</layout>
<filter class="com.telek.utils.CustomLogFilter">
<param name="levelMin" value="25000" />
<param name="levelMax" value="25000" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="myConsole" />
<appender-ref ref="Info" />
<appender-ref ref="Debug" />
<appender-ref ref="Warn" />
<appender-ref ref="Error" />
<appender-ref ref="MinaCustom" />
</root>
</log4j:configuration>