1.引言:

《log4j相比System.out的优势》(自己blog中的文章)
    Log4j就是帮助开发人员进行日志输出管理的API类库。它最重要的特点就可以配置文件灵活的设置日

志信息的优先级、日志信息的输出目的地以及日志信息的输出格式。

    Log4j除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。

    程序员经常会遇到脱离java ide环境调试程序的情况,这时大多数人会选择使用System.out.println

语句输出某个变量值的方法进行调试。这样会带来一个非常麻烦的问题:一旦哪天程序员决定不要显示这

些System.out.println的东西了就只能一行行的把这些垃圾语句注释掉。若哪天又需调试变量值,则只能

再一行行去掉这些注释恢复System.out.println语句。

    使用log4j可以很好的处理类似情况。

2)log4j——一个让我发愁了一段时间的东东:
    12月份的时候fengy让配置log4j,自己折腾了一个星期都没弄出来,并且很不明白到底是哪个环

节出问题了。因为当时对相对路径,常用接口等都不是很了解,wangwm配出来后,还是不知道自己的为什

么跑不起来。
    现在回头想想,一直没有进展,是因为(a)没有java.io的知识;(b)没有java相对路径,绝

对路径的知识;(c)根本不理解要完成配置,必须完成哪些工作。
    当时弄不出来,一直就停留在.java文件中的“PropertyConfigurator.configure

(myfile.getPath());”这行代码里了,当时无论怎么都读不到log4j.properties文件,想了很多办法,

包括查如何读取属性文件,如果用相对路径读取属性文件,等等。但这些都是雾里看花,本质没弄清楚,

查再多的细节都不至于事。
    现在总算对log4j的配置有了一点认识了!

2.首先分清在各个环境下配置log4j应完成什么事情:
1)java工程环境:
jdk1.4之后就集成了日志功能,D:\Program Files\Java\jre1.5.0_04\lib目录下有logging.properties

文件,如果要使用日志,直接使用或者修改这个logging.properties属性文件就可以了!

2)在tomcat中用log4j配置日志系统:
a)
第一步:下载log4j.jar,并把log4j.jar放入$CATALINA_HOME/common/lib.
第二步:写配置文件log4j.properties:
#log4j.properties

log4j.rootLogger=warn, A1,warnlog
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# Print the date in ISO 8601 format
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

log4j.appender.warnlog=org.apache.log4j.FileAppender  
log4j.appender.warnlog.MaxFileSize=50000KB   
log4j.appender.warnlog.MaxBackupIndex=0   
log4j.appender.warnlog.file=F:/UserWorkSpace/jiangcm/logs/warn.html  
log4j.appender.warnlog.layout=org.apache.log4j.HTMLLayout  
log4j.appender.warnlog.layout.ConversionPattern=%d   %X   %-5p     %m%n   

log4j.logger.org.apache=warn
第三步:在目录“F:/UserWorkSpace/jiangcm/logs”下新建warn.html文件;
第四步:把该log4j.properties文件放到$CATALINA_HOME/common/classes/目录下.
第五步:重启tomcat.
ok,现在就已经在tomcat中配置好log4j了。

b)如何使用?——在.java文件中得到一个Logger对象,然后就可以直接输出日志了。如下例子所示:
//Bar.java
package com.foo;
import org.apache.log4j.Logger;

public class Bar {
static Logger logger = Logger.getLogger(Bar.class);
public void doIt() {
logger.debug("there is a debug...");
logger.info("there is a info...");
logger.warn("there is a warning...");
}
}

ok!也就是说在tomcat中配置,只需要把log4j.jar和log4j.properties分别放到$CATALINA_HOME/common/

的lib和classes下就ok了!不需要再做别的设置,在.java中直接使用即可。

3)在tomcat的webapp中配置log4j:也就是配置单个的webapp。
这个就有点麻烦了!因为在整个tomcat中配置,tomcat会自动读入log4j.properties;但是在webapp中需

要写一个Servlet,初始化log4j,并且在web.xml中设置给servlet为tomcat启动时也自动启动。

这种方法自己还没有实验成功,不过看过wangwm配置成功了。

不过大致的步骤都是一样的,大概有以下几步吧:
第一步:下载log4j.jar,并把log4j.jar放入webappname/WEB-INF/classes/lib.
第二步:写配置文件log4j.properties:
注:
解决log4j输出的日志文件的位置的配置问题
http://wangluwww.spaces.live.com/blog/
我一直希望自己的web应用的配置能够简化,最好的方式就是打个包后扔哪都能用,即使非得再做一些配

置的话,也希望只是一些连接池的配置信息。这个目标在现在手头的这个项目中也几乎达到了,除了log

文件的位置。
在log4j的配置文件中对于log输出的路径一向都是使用绝对路径,这样就导致在不同的机器上部署时都得

重新定义一下log文件的输出位置。虽说费时不多,可对于我这种宁可少一事,不愿多一事的人来说,总

是觉得有点郁闷。
踏破铁鞋无觅,得来不费功夫。不经意见看到了一个文档,介绍说log4j的配置文件支持windows的环境变

量,格式类似velocity:${env},ok,问题解决:
一般来说我们会将一些初始化的信息放到web.xml中,以便在系统启动时就运行。循此思路,将log文件的

位置放到webapp下面的任意处,如webapp/WEB-INF/conf/logs下面,则可以在log4j.properties文件中做

如下定义:
log4j.appender.R.File=${webappHome}/WEB-INF/conf/logs/sysout.log
其中的${webappHome}即是通过System.setProperty("webappHome", webappHome);实现的,此操作可通过

一初始的servlet进行,具体方法略。


第四步:把该log4j.properties文件放到WEB-INF/classes/目录下.
第五步:写一个初始化的servlet;
第六步:在web.xml中配置该servlet,并设置为自动启动;
第七步:重启tomcat.

具体做的时候可以参考以下资料:

竹笋炒肉 Log4J学习笔记(1)(2)(3)
http://hedong.3322.org/archives/000193.html
http://hedong.3322.org/archives/000195.html
http://hedong.3322.org/archives/000197.html