Log4J学习笔记(2)

 
前面主要记了一些原理,今天是实务。

1 、研究发现,一个系统中4 % 的代码是用来作logging的。
2 、Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key = value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。
  Log4J运行时,不对环境做任何假定,尤其是没有默认的存放器。
3 、有几种方式可以配置Log4J
1 )在程序中调用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.PatternLayout
log4j.appender.A1.layout.ConversionPattern
=%- 4r [ % t]  %- 5p  % % -   % m % n

利用配置文件,可以很方便地修改配置。如下例
log4j.rootLogger
= debug, stdout, R

log4j.appender.stdout
= org.apache.log4j.ConsoleAppender
log4j.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  format
log4j.appender.stdout.layout.ConversionPattern
=% d [ % t]  %- 5p  % -   % m % n

log4j.appender.R
= org.apache.log4j.RollingFileAppender
log4j.appender.R.File
= example.log

log4j.appender.R.MaxFileSize
= 100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex
= 1

log4j.appender.R.layout
= org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern
=% % % -   % 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 %
#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. class
log4j.appender.appenderName.option1 
=  value1
...
log4j.appender.appenderName.option 
=  valueN

Log4j提供的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. class
log4j.appender.appenderName.layout.option1 
=  value1
....
log4j.appender.appenderName.layout.option 
=  valueN

Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值