前面主要记了一些原理,今天是实务。1、研究发现,一个系统中4%的代码是用来作logging的。2、Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。 Log4J运行时,不对环境做任何假定,尤其是没有默认的存放器。3、有几种方式可以配置Log4J1)在程序中调用BasicConfigurator.configure()方法;2)配置放在文件里,通过命令行参数传递文件名字,通过PropertyConfigurator.configure(args[x])解析并配置;3)配置放在文件里,通过环境变量传递文件名等信息,利用log4j默认的初始化过程解析并配置;4)配置放在文件里,通过应用服务器配置传递文件名等信息,利用一个特殊的servlet来完成配置。看下面的例子:import com.foo.Bar; // Import log4j classes. import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; public class MyApp ...{ // Define a static logger variable so that it references the // Logger instance named "MyApp". static Logger logger = Logger.getLogger(MyApp.class); public static void main(String[] args) ...{ // Set up a simple configuration that logs on the console. BasicConfigurator.configure(); logger.info("Entering application."); Bar bar = new Bar(); bar.doIt(); logger.info("Exiting application."); } } package com.foo; import org.apache.log4j.Logger; public class Bar ...{ static Logger logger = Logger.getLogger(Bar.class); public void doIt() ...{ logger.debug("Did it again!"); } } BasicConfigurator.configure给根记录器增加一个ConsoleAppender,输出格式通过PatternLayout设为"%-4r [%t] %-5p %c %x - %m%n",还有根记录器的默认级别是Level.DEBUG. 记录器之间的关系如下图: 输出结果如下:0 [main] INFO MyApp - Entering application.36 [main] DEBUG com.foo.Bar - Did it again!51 [main] INFO MyApp - Exiting application. 下面的代码结合配置信息,会得到与上述程序一样的结果。import com.foo.Bar; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class MyApp ...{ static Logger logger = Logger.getLogger(MyApp.class.getName()); public static void main(String[] args) ...{ // BasicConfigurator replaced with PropertyConfigurator. PropertyConfigurator.configure(args[0]); logger.info("Entering application."); Bar bar = new Bar(); bar.doIt(); logger.info("Exiting application."); } }配置文件的内容如下:# Set root logger level to DEBUG and its only appender to A1.log4j.rootLogger=DEBUG, A1# A1 is set to be a ConsoleAppender.log4j.appender.A1=org.apache.log4j.ConsoleAppender# A1 uses PatternLayout.log4j.appender.A1.layout=org.apache.log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n利用配置文件,可以很方便地修改配置。如下例log4j.rootLogger=debug, stdout, Rlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout# Pattern to output the caller's file name and line number.#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n# Print the date in ISO 8601 formatlog4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%nlog4j.appender.R=org.apache.log4j.RollingFileAppenderlog4j.appender.R.File=example.loglog4j.appender.R.MaxFileSize=100KB# Keep one backup filelog4j.appender.R.MaxBackupIndex=1log4j.appender.R.layout=org.apache.log4j.PatternLayoutlog4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n# Print only messages of level WARN or above in the package com.foo.log4j.logger.com.foo=WARN对于tomcat4,利用环境变量传递参数的,可参见以下几个例子unix设置export CATALINA_OPTS ="-Dlog4j.configuration=foobar.txt"<===用PropertyConfigurator解析export CATALINA_OPTS ="-Dlog4j.debug -Dlog4j.configuration=foobar.xml"<===用DOMConfigurator解析以下是windows设置set CATALINA_OPTS =-Dlog4j.configuration=foobar.lcf -Dlog4j.configuratorClass=com.foo.BarConfigurator<===用com.foo.BarConfigurator解析set CATALINA_OPTS =-Dlog4j.configuration=file:/c:/foobar.lcf配置文件位置如果没有明确指明,则要放在WEB-INF/classes目录下。4、用servlet配置log4j以下都是参考冰之火的文章,抄来放在这儿,并做了一些必要的修改。需要说明的是,下面的代码需要自己写并发布,下的jar中没有这个类。待我以后写一个,也放上来。我也写了两个,在笔记(三)中。在Application目录下的web.xml文件加入以后代码 <servlet> <servlet-name>log4jlog4j-init</servlet-name> <servlet-class>com.apache.jakarta.log4j.Log4jInit</servlet-class> <init-param> <param-name>log4j</param-name> <param-value>/WEB-INF/log4j.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>这段代码的意思是说,在Tomcat启动时加载com.apache.jakarta.log4j.Log4jInit这个名叫Log4jInit.class这个类文件。其中Log4jInit.class的源代码如下 package com.apache.jakarta.log4j;import org.apache.log4j.PropertyConfigurator;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Log4jInit extends HttpServlet ...{ public void init() ...{ String prefix = getServletContext().getRealPath("/"); String file = getInitParameter("log4j"); // if the log4j-init-file is not set, then no point in trying System.out.println("................log4j start"); if(file != null) ...{ PropertyConfigurator.configure(prefix+file); } }public void doGet(HttpServletRequest req, HttpServletResponse res) ...{ }}在加载的过程中,程序会读取/WEB-INF/log4j.properties这个文件。配置文件讲解如下:# Set root logger level to DEBUG and its only appender to A1 #log4j中有五级logger #FATAL 0 #ERROR 3 #WARN 4 #INFO 6 #DEBUG 7 #配置根Logger,其语法为:#log4j.rootLogger = [ level ] , appenderName, appenderName, …log4j.rootLogger=INFO, A1 ,R#这一句设置以为着所有的log都输出#如果为log4j.rootLogger=WARN, 则意味着只有WARN,ERROR,FATAL#被输出,DEBUG,INFO将被屏蔽掉.# A1 is set to be a ConsoleAppender. #log4j中Appender有几层如控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等#ConsoleAppender输出到控制台 log4j.appender.A1=org.apache.log4j.ConsoleAppender # A1 使用的输出布局,其中log4j提供4种布局. org.apache.log4j.HTMLLayout(以HTML表格形式布局)#org.apache.log4j.PatternLayout(可以灵活地指定布局模式),#org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),#org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)log4j.appender.A1.layout=org.apache.log4j.PatternLayout #灵活定义输出格式 具体查看log4j javadoc org.apache.log4j.PatternLayout #d 时间 .... log4j.appender.A1.layout.ConversionPattern=%-d...{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n #R 输出到文件 RollingFileAppender的扩展,可以提供一种日志的备份功能。log4j.appender.R=org.apache.log4j.RollingFileAppender #日志文件的名称log4j.appender.R.File=log4j.log #日志文件的大小log4j.appender.R.MaxFileSize=100KB # 保存一个备份文件log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.TTCCLayout#log4j.appender.R.layout.ConversionPattern=%-d...{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n配置根Logger,其语法为:log4j.rootLogger = [ level ] , appenderName, appenderName, ...level 是日志记录的优先级appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。配置日志信息输出目的地Appender,其语法为log4j.appender.appenderName = fully.qualified.name.of.appender.classlog4j.appender.appenderName.option1 = value1...log4j.appender.appenderName.option = valueNLog4j提供的appender有以下几种:org.apache.log4j.ConsoleAppender(控制台),org.apache.log4j.FileAppender(文件),org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)配置日志信息的格式(布局),其语法为:log4j.appender.appenderName.layout = fully.qualified.name.of.layout.classlog4j.appender.appenderName.layout.option1 = value1....log4j.appender.appenderName.layout.option = valueNLog4j提供的layout有以下几种:org.apache.log4j.HTMLLayout(以HTML表格形式布局),org.apache.log4j.PatternLayout(可以灵活地指定布局模式),org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)