目的
由于要实现需求:将特定的跟踪日志写入单独的日志文件,且其他的日志输出不受影响。故需要实现一个自定义的日志级别并指定配置文件,将特定的日志信息输入特定文件。
实现
本代码基于log4j 1.2.8,并调试成功。配置文件基于log4j.xml
自定义日志级别类
package com.example.log4j.level;
import org.apache.log4j.Level;
public class MyLevel extends Level {
public final static int TRACE_INT = 9000;
/**
* The <code>TRACE</code> Level designates fine-grained
* informational events that are most useful to trace an
* application.
*/
final static public Level TRACE = new MyLevel(TRACE_INT, "TRACE", 7);
/**
* Instantiate a level object.
*
* @param level
* @param levelStr
* @param syslogEquivalent
*/
protected MyLevel(int level, String levelStr, int syslogEquivalent) {
super(level, levelStr, syslogEquivalent);
}
/**
* Convert the string passed as argument to a level. If the
* conversion fails, then this method returns {@link #DEBUG}.
*/
public
static Level toLevel(String sArg) {
return (Level) toLevel(sArg, Level.DEBUG);
}
/**
* Convert an integer passed as argument to a level. If the
* conversion fails, then this method returns {@link #DEBUG}.
*/
public
static Level toLevel(int val) {
return (Level) toLevel(val, Level.DEBUG);
}
/**
* Convert an integer passed as argument to a level. If the
* conversion fails, then this method returns the specified default.
*/
public
static Level toLevel(int val, Level defaultLevel) {
switch (val) {
case ALL_INT:
return ALL;
case TRACE_INT:
return MyLevel.TRACE;
case DEBUG_INT:
return Level.DEBUG;
case INFO_INT:
return Level.INFO;
case WARN_INT:
return Level.WARN;
case ERROR_INT:
return Level.ERROR;
case FATAL_INT:
return Level.FATAL;
case OFF_INT:
return OFF;
default:
return defaultLevel;
}
}
/**
* Convert the string passed as argument to a level. If the
* conversion fails, then this method returns the value of
* <code>defaultLevel</code>.
*/
public
static Level toLevel(String sArg, Level defaultLevel) {
if (sArg == null)
return defaultLevel;
String s = sArg.toUpperCase();
if (s.equals("ALL")) return Level.ALL;
if (s.equals("TRACE")) return MyLevel.TRACE;
if (s.equals("DEBUG")) return Level.DEBUG;
//if(s.equals("FINE")) return Level.FINE;
if (s.equals("INFO")) return Level.INFO;