一.装载log4j-1.2.8.jar到你的工程WEB-INF/lib目录下(下载地址)
二.设置资源文件:log4j.properties
一般情况下该资源文件放在工程WEB-INF/classes(默认的)目录下,因为这样子系统可以自己找到该资源文件,不用我们人工指定。
log4j.properties内容格式大体如下:
log4j.rootCategory=INFO, appender1 , appender2
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.appender1.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
log4j.appender.appender2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.appender2.File=D://Tomcat 5.5//logs//qc.log
log4j.appender.appender2.layout=org.apache.log4j.PatternLayout
log4j.appender.appender2.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
#以下是工程使用包时出现错误的日志等级的定义,可以不写
log4j.logger.com.neusoft=DEBUG
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.net.sf.navigator=ERROR
log4j.logger.org.apache.commons=ERROR
说明:
1.log4j.rootCategory=INFO, appender1,appender2
将等级为INFO的日志信息输出到appender1和appender2这两个目的地,接下去就是定义这两个appender(appender可以任意起名).日志等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示。
2.log4j.appender.appender1=org.apache.log4j.ConsoleAppender
将日志输出端appender1定义为一个控制台,表示日志将输出到控制台。例外还有以下几种输出方式:
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
appender2就是采用DailyRollingFileAppender,表示日志信息输出到日志文件(接下来指定日志路径)
3.log4j.appender.appender1.layout=org.apache.log4j.PatternLayout
该属性是指定日志信息将采用什么布局显示。
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
4.log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n
该属性是指定每条日志信息将以什么固定格式输出。
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
[message ]固定显示的信息
5.log4j.appender.appender2.File=D://Tomcat 5.5//logs//qc.log
指定日志文件的路径,可以采用绝对路径和相对路径(具体实现下面再说)
三.log4j使用
private static Logger logger = Logger.getLogger(LogInit. class ); // LogInit.class所在类的类名
logger.info( " 输出日志信息 " );
以上代码仅仅log4j.properties 资源文件在默认路径才不会出现错误。假如资源文件路径不是默认的,可以这么做:
PropertyConfigurator.configure(path);
使用这种方式就可以指定任意的*.properties文件,不一定是log4j.properties,系统也可以识别了。不过路径确实很麻烦,要是应用服务器的根目录变了,还要重新写路径再编译文件,可以这么得到绝对路径:
// 得到根目录,好像要在Servlet才能有这种方法,所以你的类要是一个在web.xml定义的servlet
四.log4j日志文件动态指定
上面是固定而且以绝对路径来指定日志文件的目录,下面介绍三种动态指定法(从网上总结的,在此感谢那些同仁)
第一种:使用系统属性,设置相对路径,方法如下
1.更改上面的资源文件:
log4j.appender.appender2.File=${variable}/mylog.log
2.在所在类,设置系统属性,并且重新加载资源文件
System.setProperty("varible","日志所在目录");
PropertyConfigurator.configure("资源文件绝对路径");//注意先后顺序。
第二种:不修改资源文件内容,在具体类中修改资源文件的属性值
try ... {
FileInputStream fis = new FileInputStream(propertyPath);//资源文件绝对路径
property.load(fis);
property.setProperty("log4j.appender.file.File", "d:/test1.log");
PropertyConfigurator.configure(property);
fis.close();
} catch (FileNotFoundException e) ... {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) ... {
e.printStackTrace();
}
以上两种都需要在所在类动手脚,其实就是通过类修改资源文件的属性来实现的,这样子还不如直接修改资源文件。接下来这种就是只需修改系统环境变量。
第三种:
首先修改资源文件:log4j.appender.appender2.File=${variable}/mylog.log,这里variable变成系统环境变量。
然后添加系统的一个名为variable环境变量,值为日志文件的目录名,比如日志放在d:/log/mylog.log,值就等于d:/log就行。
最后一点也是关键一步,修改log4j-1.2.8.jar里java文件并重新编译(需要你有src/java/org/apache/log4j/helpers/OptionConverter.java的源代码):
添加一个方法:
try ...{
String value = System.getenv(key);
if (value == null)
...{
value = def;
}
return value;
} catch(Throwable e) ...{ // MS-Java throws com.ms.security.SecurityExceptionEx
LogLog.debug("Was not allowed to read system property ""+key+"".");
return def;
}
}
修改部分代码:
/**/ /*
String replacement = getSystemProperty(key, null);
// then try props parameter
if(replacement == null && props != null) {
replacement = props.getProperty(key);
}
*/
// 修改为:
String replacement = getSystemProperty(key, null );
// then try in environment properties
if (replacement == null )
... {
replacement = getEnvProperty(key, null);
}
// then try props parameter
if (replacement == null && props != null ) ... {
replacement = props.getProperty(key);
}
总的来说,第三种比较好些,只要设置系统环境变量。个人觉得如果你不要经常修改日志文件位置,你干脆直接在资源文件固定好。