现在的位置: 首页 > 综合 > 正文

Log4j.properties文件配置详解

2013年12月11日 ⁄ 综合 ⁄ 共 13041字 ⁄ 字号 评论关闭

闲来无事,测了下log4j的各种配置,包括根据包路径和类、按照日期产生日志文件,不同级别生成不同文件等,下面是网络中收集的内容,特此记录下

Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。

1. 配置文件

Log4J配置文件的基本格式如下:

 #配置根Logger
log4j.rootLogger 
 =   [ level ]   ,  appenderName1 ,  appenderName2 , 
 …

#配置日志信息输出目的地Appender
log4j.appender.appenderName 
 = 
 fully.qualified.name.of.appender.class 
  log4j.appender.appenderName.option1 
 = 
 value1 
  … 
  log4j.appender.appenderName.optionN 
 = 
 valueN 

#配置日志信息的格式(布局)
log4j.appender.appenderName.layout 
 = 
 fully.qualified.name.of.layout.class 
  log4j.appender.appenderName.layout.option1 
 = 
 value1 
  … 
  log4j.appender.appenderName.layout.optionN 
 =  valueN 


其中 [level] 是日志输出级别,共有5级:

 FATAL      0  
ERROR     
 3 
 
WARN      
 4 
 
INFO      
 6 
 
DEBUG     
 7 


Appender 为日志输出目的地,Log4j提供的appender有以下几种:

 org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)


Layout:日志输出格式,Log4j提供的layout有以下几种:

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


打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:

   %m  
输出代码中指定的消息
  %p   输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
  %r   输出自应用启动到输出该log信息耗费的毫秒数 
  %c   输出所属的类目,通常就是所在类的全名 
  %t   输出产生该日志事件的线程名 
  %n   输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n” 
  %d   输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss
 , SSS},输出类似:2002年10月18日  22  10  28  921 
 
  %l   输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:
 10 


2. 在代码中初始化Logger: 

1)在程序中调用BasicConfigurator.configure()方法:给根记录器增加一个ConsoleAppender,输出格式通过PatternLayout设为"%-4r [%t] %-5p %c %x - %m%n",还有根记录器的默认级别是Level.DEBUG

2)配置放在文件里,通过命令行参数传递文件名字,通过PropertyConfigurator.configure(args[x])解析并配置;

3)配置放在文件里,通过环境变量传递文件名等信息,利用log4j默认的初始化过程解析并配置;

4)配置放在文件里,通过应用服务器配置传递文件名等信息,利用一个特殊的servlet来完成配置。

3. 为不同的 Appender 设置日志输出级别:

当调试系统时,我们往往注意的只是异常级别的日志输出,但是通常所有级别的输出都是放在一个文件里的,如果日志输出的级别是BUG!?那就慢慢去找吧。

这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊。当然可以,Log4j已经提供了这样的功能,我们只需要在配置中修改AppenderThreshold
 
就能实现,比如下面的例子:

[配置文件]

 ### set log levels ###
log4j.rootLogger
 = debug ,  stdout ,  D , 
 E

### 输出到控制台 ###
log4j.appender.stdout
 = 
org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target
 = 
System.out
log4j.appender.stdout.layout
 = 
org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
 =  %d{ABSOLUTE} %5p %c{ 1 
}:%L - %m%n

### 输出到日志文件 ###
log4j.appender.D
 = 
org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File
 = 
logs/log.log
log4j.appender.D.Append
 = 
true
log4j.appender.D.Threshold
 = 
DEBUG ## 输出DEBUG级别以上的日志
log4j.appender.D.layout
 = 
org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern
 = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ] 
 %m%n

### 保存异常信息到单独文件 ###
log4j.appender.D
 = 
org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File
 = 
logs/error.log ## 异常日志文件名
log4j.appender.D.Append
 = 
true
log4j.appender.D.Threshold
 = 
ERROR ## 只输出ERROR级别以上的日志!!!
log4j.appender.D.layout
 = 
org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern
 = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n


[代码中使用] 

 public   class  TestLog4j  {
    
 public   static   void  main(String[] args)  
{
        PropertyConfigurator.configure(
 " D:/Code/conf/log4j.properties " 
);
        Logger logger 
 =  Logger.getLogger(TestLog4j. class 
);
        logger.debug(
 " debug " 
);
        logger.error(
 " error " 
);
    }
 

}


运行一下,看看异常信息是不是保存在了一个单独的文件error.log中。

----------------------------------------------------------------------------------------------------------------------------------------------------

资料:

=============================================================================================

===============================================================================================

log4j.properties文件例子

1.================================================================

这个文件就是本文的重点,也就是log4j的配置文件。

# 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



2.==========================================================================================

下面我给出一个在weblogic下使用log4j的配置过程,首先给出这个配置文件的完整信息。

#log4j.rootLogger=INFO,A1,R //这一句指定了日志输出的级别为info,A1和R分别代表日志输出到什么地方。

log4j.category.hybl_wshabcm=debug,A1,R //这一句指定了日志具体输出哪个包的信息,以及输出位置

log4j.appender.A1=org.apache.log4j.ConsoleAppender //这里指定了日志输出的第一个位置A1是控制台ConsoleAppender

/*

*其中,Log4j提供的appender有以下几种:

*org.apache.log4j.ConsoleAppender(控制台),

*org.apache.log4j.FileAppender(文件),

*org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),

*org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),

*org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

*

*/

log4j.appender.A1.layout=org.apache.log4j.PatternLayout //指定A1的布局模式

/*

*其中,Log4j提供的layout有以下几种:

×org.apache.log4j.HTMLLayout(以HTML表格形式布局),

*org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

*org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

*org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

*/

log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n //指定日志的输出格式



log4j.appender.R=org.apache.log4j.RollingFileAppender //指定以文件的方式输出日志

log4j.appender.R.File=c:/sys.html //文件位置

log4j.appender.R.MaxFileSize=500KB //文件最大尺寸

log4j.appender.R.MaxBackupIndex=1 //备份数

log4j.appender.R.layout=org.apache.log4j.HTMLLayout //文件的格式为Html格式

#log4j.appender.R.layout=org.apache.log4j.PatternLayout 

log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

 ---------------------------------------------------------------------------------------------------------------------------------------------------

错误日志发送email



1.  打开log4j.properties文件

2.  rootLogger加上一个Appender, 即MAIL, 如log4j.rootLogger=ERROR,A1,MAIL

3.  配置Appender信息,在文件的末尾加上以下部分

# Configuration for receiving e-mails when ERROR messages occur.


#自定义的Appender

log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender

#日志的错误级别

log4j.appender.MAIL.Threshold=ERROR 

#缓存文件大小,日志达到512K时发送Email

log4j.appender.MAIL.BufferSize=512

#发件人
log4j.appender.MAIL.From=test@163.com

#发送邮件的服务器

log4j.appender.MAIL.SMTPHost=smtp.163.com

#邮件的标题

log4j.appender.MAIL.Subject=Log4J Message

#日志邮件的接收者
log4j.appender.MAIL.To=test@163.com

#日志PatternLayout

log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout

#日志的格式

log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


以上文件皆测试通过,如不通过请查看自己的email发送环境.

----------------------------------------------------------------------------------------------------------------------------------------------------

查看了SMTPAppender.java的源代码,才发现Log4J缺省提供的SMTPAppender并不支持SMTP的认证功能。难道现在匿名的SMTP邮件服务器很多吗?我手头的是Log4J的 1.2.8版本,去logging.apache.org看,发现已经有新的版本了: 1.2.11,呵呵,窃喜。这样的简单、基本的需求Log4J开发组应该已经添加上了吧。

下载、查看,再次失望之极!

看来只有自己动手添加了。本来应该重新定义一个名字,算做一个自定义Appender吧,但为了使我很多应用中的log4j.properties不用修改过多,就直接在原来的SMTPAppender.java上做了修改。另外一个更重要的原因是:

    我认为:这是一个基本的、必须的SMTPAppender应该具有的功能。

主要在SMTPAppender.java中添加了如下代码:

a. 添加实例变量

  private String smtpUsername;

  private String smtpPassword;

b. 将 activateOptions() 方法中的

Session session = Session.getInstance(props, null);

修改为:



    if(smtpPassword != null && smtpUsername != null) {

      // Setup mail server authentication

      props.put("mail.smtp.auth", "true");

   // props.put("mail.transport.protocol", "smtp");

      authenticator = new Authenticator() {

        protected PasswordAuthentication getPasswordAuthentication() {

          return new PasswordAuthentication(smtpUsername, smtpPassword);

        }

      };

    }

    // Get session

    Session session = Session.getDefaultInstance(props,authenticator);

c. 添加Set方法

  public void setSMTPPassword(String smtpPassword) {

    this.smtpPassword = smtpPassword;

  }

  public void setSMTPUsername(String smtpUsername) {

    this.smtpUsername = smtpUsername;

  }

编译,并重新打包log4j-1.2.8.jar。在应用中替换原log4j-1.2.8.jar包,并修改log4j.properties文件,在SMTPAppender的配置中添加如下两行:

log4j.appender.MAIL.SMTPUsername=

log4j.appender.MAIL.SMTPPassword=

OK,现在这个SMTPAppender就可以使用需要用户名、密码验证的SMTP服务器(现在绝大多数SMTP服务器)进行Email报警发送了。

-------------------------------------------------------------------------------------------------------------------------------------

log4j详解

        根据网络资料整理        
>>>>1. 概述<<<<
  1.1. 背景
  

  在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;跟踪代码运行时轨迹,作为日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。

  

  最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥了代码的主体。

  

  1.2. Log4j简介

  

  在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j。

  

   Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就 是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

  

  此外,通过Log4j其他语言接口,您可以在C、C+ +、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通 过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。

  

  本文介绍的Log4j版本是 1.2.3。作者试图通过一个简单的客户/服务器Java程序例子对比使用与不使用Log4j 1.2.3的差别,并详细讲解了在实践中最常使用Log4j的方法和步骤。在强调可重用组件开发的今天,相信Log4j将会给广大的设计开发人员带来方 便。加入到Log4j的队伍来吧!

  
>>>> 2. 一个简单的例子 <<<<

  我们先来看一个简单的例子,它是一个用Java实现的客户/服务器网络程序。刚开始我们不使用Log4j,而是使用了一系列的打印语句,然后我们将使用Log4j来实现它的日志功能。这样,大家就可以清楚地比较出前后两个代码的差别。

  

  2.1. 不使用Log4j

  

  2.1.1. 客户程序

  package log4j ;

  

  import java.io.* ;

  import java.net.* ;

  

  /**

   *

   * <p> Client Without Log4j </p>

   * <p> Description: a sample with log4j</p>

   * @version 1.0

   */

  public class ClientWithoutLog4j {

  

    /**

     *

     * @param args

     */

    public static void main ( String args [] ) {

  

      String welcome = null;

      String response = null;

      BufferedReader reader = null;

      PrintWriter writer = null;

      InputStream in = null;

      OutputStream out = null;

      Socket client = null;

  

      try {

        client = new Socket ( "localhost", 8001 ) ;

        System.out.println ( "info: Client socket: " + client ) ;

        in = client.getInputStream () ;

        out = client.getOutputStream () ;

      } catch ( IOException e ) {

        System.out.println ( "error: IOException : " + e ) ;

        System.exit ( 0 ) ;

      }

  

      try{

        reader = new BufferedReader( new InputStreamReader ( in ) ) ;

        writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;

  

        welcome = reader.readLine () ;

        System.out.println ( "debug: Server says: '" + welcome + "'" ) ;

  

        System.out.println ( "debug: HELLO" ) ;

        writer.println ( "HELLO" ) ;

        response = reader.readLine () ;

        System.out.println ( "debug: Server responds: '" + response + "'") ;

  

        System.out.println ( "debug: HELP" ) ;

        writer.println ( "HELP" ) ;

        response = reader.readLine () ;

        System.out.println ( "debug: Server responds: '" + response + "'" ) ;

  

        System.out.println ( "debug: QUIT" ) ;

        writer.println ( "QUIT" ) ;

      } catch ( IOException e ) {

        System.out.println ( "warn: IOException in client.in.readln()" ) ;

        System.out.println ( e ) ;

      }

      try{

        Thread.sleep ( 2000 ) ;

      } catch ( Exception ignored ) {}

    }

  }

  

  2.1.2. 服务器程序

  package log4j ;

  

  import java.util.* ;

  import java.io.* ;

  import java.net.* ;

  

  /**

   *

   * <p> Server Without Log4j </p>

   * <p> Description: a sample with log4j</p>

   * @version 1.0

   */

  public class ServerWithoutLog4j {

  

    final static int SERVER_PORT = 8001 ; // this server's port

  

    /**

     *

     * @param args

     */

    public static void main ( String args [] ) {

      String clientRequest = null;

      BufferedReader reader = null;

      PrintWriter writer = null;

      ServerSocket server = null;

      Socket socket = null;

      InputStream in = null;

      OutputStream out = null;

  

      try {

        server = new ServerSocket ( SERVER_PORT ) ;

        System.out.println ( "info: ServerSocket before accept: " + server ) ;

        System.out.println ( "info: Java server without log4j, on-line!" ) ;

  

        // wait for client's connection

        socket = server.accept () ;

        System.out.println ( "info: ServerSocket after accept: " + server ) ;

  

        in = socket.getInputStream () ;

        out = socket.getOutputStream () ;

  

      } catch ( IOException e ) {

        System.out.println( "error: Server constructor IOException: " + e ) ;

        System.exit ( 0 ) ;

      }

      reader = new BufferedReader ( new InputStreamReader ( in ) ) ;

      writer = new PrintWriter ( new OutputStreamWriter ( out ) , true ) ;

  

      // send welcome string to client

      writer.println ( "Java server without log4j, " + new Date () ) ;

  

      while ( true ) {

        try {

  

抱歉!评论已关闭.