log4j详细配置

记录下!!!

 

原文出处:http://hi.baidu.com/ideapocket/blog/item/7b2c6d677de82723aa184cbc.html

 

log4j详细配置

2008-11-20 11:02

1。什么是日志:
  程序运行时,往特定输出文件或数据库里输出程序信息,
  如:出错信息,运行记录,调试记录,等等。

    日志(LOG)一般分为以下几种类型。
    FATAL:系统错误(大错误)(程序被错误中断)
           系统出现大错误时输出(程序无法处理的大错误,如硬件错误)
    ERROR:异常(程序被错误中断)
           程序运行时出现的错误(程序员可以捕获处理)
    WARN :警告(程序不会中断)
           程序不算出错,但以不推荐方式运行时输出。
    INFO : 信息(程序不会中断)
           程序中有意输出的信息,如程序运行信息,
           如“程序开始”“程序结束”等。
    DEBUG: 调试记录(程序不会中断)
           调试程序时,跟踪程序运行的输出信息。
2.Log4J的使用。
    Log4J是为了输出日志的Java程序包,是Apached的一个子项目。
    可在http://logging.apache.org 下载并免费使用。
    可以把LOG输出到,控制台,文件,或数据库。
    这个网址里有很多Log4程序包,他们分别是,
    log4c          -- ANSI C 版
    log4E          -- Eiffel 版
    log::Log4perl -- Perl 版
    log4net        -- .NET 版
    log4r          -- Ruby 版
    log4j          -- Java版

3.Log4J的能输出LOG的优先级。
级别高 OFF   关闭所有LOG
        FATAL 不可预想的无法继续运行程序的场合,一般是写进syslog(
              系统日志),在应用程序中很难捕获。
        ERROR 出现异常,应用程序停止运行等,需要紧急对应的程度的错误。
        WARN 警告,以不建议的方式运行。
        INFO 信息,实际运行中最基本程度的信息,如,启动服务器,
              运行某某程序或方法,运行结束等。
        DEBUG 调试时输出的信息,有可能产生非常大量的LOG文件。
              如为解决问题而设置输出断点LOG等。DEBUG调试时输出的
              信息,所以投入运行时一般关闭DEBUG级别的LOG。
       tracever log4j的 1.2.12 新加入比DEBUG还小的断点。
级别低 ALL    打开所有LOG

4.Struts使用Log4J。
    项目里的,[JavaSource]下做一个,log4j.xml或log4j.properties以后
    Struts就可以使用Log4J了,log4j.xml,log4j.properties是Log4J的
    设置文档。struts先读入log4j.xml,要是没有再读入log4j.properties。
    我认为log4j.xml更容易理解,而且可以做到赛选各种级别LOG后输出
   (log4j.properies无法赛选),所以只讲log4j.xml。

5.Log4j.xml设置方法。
 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration   xmlns:log4j='http://jakarta.apache.org/log4j/'> 

<!-- org.apache.log4j.ConsoleAppender (输出到控制台), 
     org.apache.log4j.FileAppender    (输出到文件), 
     org.apache.log4j.DailyRollingFileAppender 

                            (每天输出产生一个日志文件), 
     org.apache.log4j.RollingFileAppender 

               (文件大小到达指定尺寸的时候产生一个新的文件), 

                可通过 log4j.appender.R.MaxFileSize=100KB 设置文件 

                大小,还可通过 log4j.appender.R.MaxBackupIndex=1 

                设置为保存一个备份文件。 
     org.apache.log4j.WriterAppender 

               (将日志信息以流格式发送到任意指定的地方) --> 

<!-- 输出通道"STDOUT",输出所有信息到控制台 

               (也就是System.out.println()) --> 
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> 
<!--org.apache.log4j.HTMLLayout    (以 HTML 表格形式布局), 
org.apache.log4j.PatternLayout (可以灵活地指定Log内容布局模式), 
org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串), 
org.apache.log4j.TTCCLayout   

                     (包含日志产生的时间、线程、类别等等信息) --> 
<!-- 输出自定义内容的LOG --> 
<layout   class="org.apache.log4j.PatternLayout"> 
<!-- 
   %m 输出代码中指定的消息 
   %p 输出优先级,即 DEBUG , INFO , WARN , ERROR , FATAL 
   %r 输出自应用启动到输出该 log 信息耗费的毫秒数 
   %c 输出打了Log的类名,%c{1}从类名开始输出一个, 

      例如com.tongshida.Action,{1}时只输出Action, 

          {2}输出 tongshida.Action 
   %C 输出.Error()方法所在的类。 
   %M 输出生成LOG的类当中的方法名称 
   %t 输出产生该日志事件的线程名 
   %n 输出一个回车换行符, Windows 平台为 “rn”,Unix 平台为 “n” 
   %d 输出日志时间点的日期或时间,默认格式为 ISO8601 ,也可以在 

      其后指定格式,比如: %d{yyyy MMM dd HH:mm:ss,SSS} ,输出类似: 

      2002 年 10 月 18 日 22 : 10 : 28 , 921 
   %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中 

      的行数。 
   %[数值]p 输出的%p字符串长度小于[数值]时,补空格,默认右对齐, 

      前加-号,左对齐,这里也可以是%m等别的 
   %.[数值]p输出的%p字符串长度大于[数值],后面切掉。 
   %[数值].[数值]p 就是综合上两行。 
   --> 
<!-- 输出时Log内容的具体定义 --> 
<param name="ConversionPattern" 

     value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> 
</layout> 
</appender> 

<!-- 输出通道"DEBUG",输出方式是:只输出DEBUG级别的LOG,并文件 

      大小到达指定大小时产生新的Log文件 --> 
<appender name="DEBUG" class="org.apache.log4j.RollingFileAppender"> 
<!-- 输出Log文件的路径和文件名 --> 
<param name="File" value="logs/debug/debug.log"/> 
<!-- TOMCAT等WEB服务器重新启动时,是否插入到原有的LOG文件里, 

      true 插入false 新建 --> 
<param name="Append" value="true"/> 

<!-- 只输出定义的级别以上的LOG,因为在下面过滤LOG信息所以屏蔽 --> 
<!-- param name="Threshold" value="info"/ --> 

<!-- 因选择了RollingFileAppender了才有下面两个 MaxFileSize, 

      MaxBackupIndex 选项 --> 
<!-- MaxFileSize是一个LOG文件的最大的文件大小,当LOG文件超过这个 

      值时,自动转成 *.log.1的LOG文件 --> 
<param name="MaxFileSize" value="500KB"/> 
<!-- MaxBackupIndex生成自动转成 *.log.1的LOG文件的个数,设置3时最多 

      生成3个LOG备份文件,它们是[*.log.1][*.log.2][*.log.3] --> 
<param name="MaxBackupIndex" value="2"/> 
<!-- 输出时Log内容的具体定义 --> 
<layout class="org.apache.log4j.PatternLayout"> 
<param name="ConversionPattern" 

        value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> 
</layout> 
<!-- 过滤输出时Log内容,在这里,LevelMin,LevelMax都定义了DEBUG, 

        所以只输出DEBUG级别LOG的数据 --> 
<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
<!-- 指定输出LOG内容的最低等级 --> 
<param name="LevelMin" value="DEBUG"/> 
<!-- 指定输出LOG内容的最高等级 --> 
<param name="LevelMax" value="DEBUG"/> 
</filter> 
</appender> 
<!-- 输出通道"INFO",输出方式是:只输出INFO级别的LOG,并文件大小 

     到达指定大小时产生新的Log文件 --> 
<appender name="INFO" class="org.apache.log4j.RollingFileAppender"> 
<param name="File" value="logs/info/info.log"/> 
<param name="Append" value="true"/> 
<param name="MaxFileSize" value="500KB"/> 
<param name="MaxBackupIndex" value="2"/> 
<layout class="org.apache.log4j.PatternLayout"> 
<param name="ConversionPattern" 

      value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> 
</layout> 
<filter   class="org.apache.log4j.varia.LevelRangeFilter"> 
<param name="LevelMin" value="INFO"/> 
<param name="LevelMax"   value="INFO" /> 
</filter> 
</appender> 
<!-- 输出通道"WARN",输出方式是:只输出WARN级别的LOG,并文件 

     大小到达指定大小时产生新的Log文件 --> 
<appender name="WARN" class="org.apache.log4j.RollingFileAppender"> 
<param   name="File" value="logs/warn/warn.log"/> 
<param name="Append" value="true"/> 
<param name="MaxFileSize" value="500KB"/> 
<param name="MaxBackupIndex" value="2"/> 
<layout class="org.apache.log4j.PatternLayout"> 
<param name="ConversionPattern" 

      value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> 
</layout> 
<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
<param name="LevelMin" value="WARN"/> 
<param name="LevelMax" value="WARN"/> 
</filter> 
</appender> 
<!-- 输出通道"ERROR",输出方式是:只输出ERROR级别的LOG,并文件 

     大小到达指定大小时产生新的Log文件 --> 
<appender name="ERROR" class="org.apache.log4j.RollingFileAppender"> 
<param name="File" value="logs/error/error.log"/> 
<param name="Append" value="true"/> 
<param name="MaxFileSize" value="500KB"/> 
<param name="MaxBackupIndex" value="2"/> 
<layout class="org.apache.log4j.PatternLayout"> 
<param name="ConversionPattern" 

       value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> 
</layout> 
<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
<param name="LevelMin" value="ERROR"/> 
<param name="LevelMax" value="ERROR"/> 
</filter> 
</appender> 
<!-- 输出通道"FATAL",输出方式是:只输出INFO级别的LOG,并文件大小 

     到达指定大小时产生新的Log文件 --> 
<appender name="FATAL" class="org.apache.log4j.RollingFileAppender"> 
<param name="File" value="logs/fatal/fatal.log"/> 
<param name="Append" value="true"/> 
<param name="MaxFileSize" value="500KB"/> 
<param name="MaxBackupIndex" value="2"/> 
<layout class="org.apache.log4j.PatternLayout"> 
<param name="ConversionPattern" 

       value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> 
</layout> 
<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
<param name="LevelMin" value="FATAL"/> 
<param name="LevelMax" value="FATAL"/> 
</filter> 
</appender> 
<!-- 输出通道"ALL",输出方式是:输出所有级别的LOG,并文件大小到达 

     指定大小时产生新的Log文件 --> 
<appender name="ALL" class="org.apache.log4j.RollingFileAppender"> 
<param name="File" value="logs/all/all.log"/> 
<param name="Append" value="true"/> 
<param name="MaxFileSize" value="500KB"/> 
<param name="MaxBackupIndex" value="2"/> 
<layout class="org.apache.log4j.PatternLayout"> 
<param name="ConversionPattern" 

      value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> 
</layout> 
<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
<param name="LevelMin" value="DEBUG"/> 
<param name="LevelMax" value="FATAL"/> 
</filter> 
</appender> 
<!-- 输出通道"EVERYDAY",输出方式是:输出所有级别的LOG,并每天一个 

     日志文件 --> 
<appender name="EVERYDAY" class="org.apache.log4j.DailyRollingFileAppender"> 
<param name="File" value="logs/ereryday/ereryday.log"/> 
<param name="Append" value="true"/> 
    <!-- param name="Threshold"   value="DEBUG"/ --> 
<!-- 以日为单位输出LOG文件,每日输出一个LOG文件--> 
<param name="DatePattern" value="'.'yyyy-MM-dd"/> 
<!-- 以时为单位输出LOG文件,每小时输出一个LOG文件 
<param name="DatePattern" value="'.'yyyy-MM-dd-HH"/> 
--> 
<layout class="org.apache.log4j.PatternLayout"> 
<!-- The default pattern: Date Priority [Category] Message --> 
<param name="ConversionPattern" 

   value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> 
<!-- The full pattern: Date MS Priority [Category] (Thread:NDC) 

       Message <param name="ConversionPattern" 

       value="%d %-5r %-5p [%c] (%t:%x) %m%n"/> 
--> 
</layout> 
<!-- 过滤输出时Log内容,在这里,LevelMin是DEBUG,LevelMax都FATAL, 

      所以输出DEBUG级别到FATAL级别的LOG数据 --> 
<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
<param name="LevelMin" value="DEBUG"/> 
<param name="LevelMax" value="FATAL"/> 
</filter> 
</appender> 

<!-- 输出通道"DATABASE",输出方式是:输出所有级别的LOG到数据库 --> 
<appender name="DATABASE" class="org.apache.log4j.jdbc.JDBCAppender"> 
        <!--数据库的驱动,这里用的是MSSQL--> 
        <param name="driver" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
<!--这是Oracle用的驱动,在这里用MSSQL所以屏蔽掉了
     <param name="driver" value="oracle.jdbc.driver.OracleDriver" /> 
--> 
        <!--要连接的数据库--> 
        <param name="URL" 

                  value="jdbc:microsoft:sqlserver://192.168.0.120: 

                  1433;DatabaseName=test" /> 
       <!--连接数据库的用户名--> 
        <param name="user" value="sa" /> 
      <!--连接数据库的密码--> 
        <param name="password" value="sa" /> 
      <!--向MSSQL数据库表LOG中插入数据的sql语句--> 
        <param name="sql" value=" INSERT INTO LOG 

           (LOGDATE,LOGLEVEL,LOGCLASS,LOGLOGGER,LOGMESSAGE) 

           values ('%d{yyyy-MM-dd HH:mm:ss}','%.50p', '%.50c', 

                   '%.50l', '%.1000m')"/> 



<!-- Oracle 的 insert 语句 
        <param name="sql" value=" insert into logrecord 

       (id,packageid,userid,syscodeid,info,logtime,loglevel) 

       values(?,?,?,?,?,to_date('%d{yyyy-MM-dd HH:mm:ss}', 

       'yyyy-MM-dd HH24:mi:ss'),'%p')" /> 
--> 
<!-- 过滤输出时Log内容,在这里,LevelMin是ERROR,LevelMax都 

       FATAL,所以输出DEBUG级别到FATAL级别的LOG数据 --> 
<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
   <param name="LevelMin" value="ERROR"/> 
   <param name="LevelMax" value="FATAL"/> 
</filter> 
</appender> 

<!-- 输出通道"HTML",输出方式是:输出所有级别的LOG到数据库 --> 
<appender name="HTML" class="org.apache.log4j.RollingFileAppender"> 

<param name="File" value="logs/html/htmllog.html" /> 
<param name="Append" value="true" /> 

<!-- 只输出定义的级别以上的LOG,因为在下面过滤LOG信息所以屏蔽 --> 
<!-- param name="Threshold" value="info"/ --> 
<param name="MaxFileSize" value="50KB"/> 
<param name="MaxBackupIndex" value="2"/> 
<!-- 好像现在只有固定输出格式 --> 
<!-- 输出的HTML都缺少</table></body>等代码,log4j的Bug? 

      我建议是不要使用 --> 
<layout class="org.apache.log4j.HTMLLayout"> 
<param name="Title" value="TSD HP HTML LOG" /> 
</layout> 
<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
<param name="LevelMin" value="DEBUG"/> 
<param name="LevelMax" value="FATAL"/> 
</filter> 
</appender> 

<!-- 设置域名限制,即com.tongshida域及以下的日志均输出到下面 

     对应的通道中, 虽然下面<roo>的<priority value="ERROR">设置 

     成ERROR,但com.tongshida下面的程序中的LOG要输出 

     level="DEBUG"的 DEBUG级别以上的LOG--> 
<!--给客户交货时要把它屏蔽--> 
<logger name="com.tongshida"> 
<!-- 设置com.tongshida以下函数输出LOG的级别 --> 
<level value="DEBUG"/> 
<!-- 好像是指定输出通道,因为下面root里指定了所以这里屏蔽掉了 
<appender-ref ref="DEBUG"/> 
--> 
</logger> 

<root> 
<!-- 设置输出范围,在这里光输出ERROR以上的,ERROR级别, 

      FATAL级别的LOG --> 
<priority value="ERROR"/> 
<!-- 上边设置的输出通道,使用的在这里定义 --> 
<appender-ref ref="STDOUT"/> 
<appender-ref ref="DEBUG"/> 
<appender-ref ref="INFO"/> 
<appender-ref ref="WARN"/> 
<appender-ref ref="ERROR"/> 
<appender-ref ref="FATAL"/> 
<appender-ref ref="ALL"/> 
<appender-ref ref="EVERYDAY"/> 
<appender-ref ref="DATABASE"/> 
<appender-ref ref="HTML"/> 

</root> 
</log4j:configuration> 




6.Log4j在Java程序里的使用。

Logger log = Logger.getLogger(inputClass);

//输出到数据库时有"'"会出错所以把它换成全角
String outmessage = message.replaceAll("'", "’");
log.debug(outmessage);log.error(outmessage);log.warn(outmessage);

如想要动态输出LOG(更改输出目录和文件名),也就是强制改变读到

内存中的[Log4j.xml]里的相应输出目录和文件名。见下面例子。


 

 

 

sampe:

1、先添加maven依赖

   <properties>
     
		<slf4j.version>1.7.7</slf4j.version>
		<log4j.version>1.2.17</log4j.version>
     
    </properties>
	
	<dependencies>
	        	<!-- log start -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>${log4j.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		<!-- log end -->
    </dependencies>		


 

2、添加log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %C:%L]  %m%n" />
		</layout>
    </appender>

	<appender name="LOG_FILE" class="org.apache.log4j.RollingFileAppender">
		<!-- <param name="File" value="${LOG.DIR}/${LOG.NAME}.log" /> -->
		<param name="File" value="./logs/overtime.log" />
		<!-- <param name="File" value="D:/info.log" /> -->
		<param name="Append" value="true" />
		<param name="MaxFileSize" value="50MB" />
		<param name="MaxBackupIndex" value="100" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %C:%L]  %m%n" />
		</layout>
	</appender>
	
	<appender name="ERROR_LOG_FILE" class="org.apache.log4j.RollingFileAppender">
		<!-- <param name="File" value="${LOG.DIR}/${LOG.NAME}.error.log" /> -->
		<param name="File" value="./logs/overtime.error.log" />
		<!-- <param name="File" value="D:/info.error.log" /> -->
		<param name="Threshold" value="error"/>
		<param name="Append" value="true" />
		<param name="MaxFileSize" value="50MB" />
		<param name="MaxBackupIndex" value="100" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %C:%L]  %m%n" />
		</layout>
	</appender>
	
	<appender name="ASYN_LOG_FILE" class="org.apache.log4j.AsyncAppender">
		<param name="BufferSize" value="1024" />
		<param name="LocationInfo" value="true" />
		<appender-ref ref="LOG_FILE" />
	</appender>
	
	<appender name="ASYN_ERROR_LOG_FILE" class="org.apache.log4j.AsyncAppender">
		<param name="BufferSize" value="1024" />
		<param name="LocationInfo" value="true" />
		<appender-ref ref="ERROR_LOG_FILE" />
	</appender>
	
    <root>
        <level value="info" />
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="ASYN_LOG_FILE" />
        <appender-ref ref="ASYN_ERROR_LOG_FILE" />
    </root>
</log4j:configuration>


3、编写测试类。

package com.dangdang.example.elasticjob.fixture.repository;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Test {
	public static Logger logger=LoggerFactory.getLogger(Test.class);
	public static void main(String args[]){
		logger.info("loginfo");
		logger.error("logerror");
		try{
			String s=null;
			s.charAt(5);
		}catch(Exception e ){
			logger.error("ERROR",e);
		}
	}
}

这时,可以看到在本地Logs目录下生成的日志文件

 

 

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

log4j.xml配置

参考:

http://blog.csdn.net/jingyuwang1/article/details/49430233

 

1      简介

 

       一般log4j的xml配置方式基本步骤有3个,第一步:配置appender;第二步:配置logger;第三步:配置root。下面配置一个ConsoleAppender和两个DailyRollingFileAppender为例具体展开。

1.1  日志级别

       不考虑其他因素,日记级别FATAL>ERROR>WARN>INFO>DEBUG,这个是许多同学都清楚的,但是结合appender,logger,root的配置后,日志打印的结果会发生一些微妙的变化。

       首先,root的中的日志级别在用户没有为某一个具体的logger配置日志级别的时候才会对该logger生效。这里就可以用来解释有的同学问为什么在root中配置了ERROR级别,但是日志中依旧有INFO的日志输出。

       其次,如果某一个appender配置了日志过滤器,那使用该appender的logger配置日志级别的时候,范围不超出appender过滤的级别信息才会被输出。

2      配置appender

       图2-1是一个标准的ConsoleAppender配置:

 

 

图 2‑1

       如注释所描述,ConsoleAppender一般在我们调试项目时候用处比较大,这里不再多余描述。

       图2-2是一个标准的FileAppender配置,这里我配置了一个info.log文件和一个eror.log,位于/opt/logs目录下面,分别用来记录一般消息和错误消息。

                                                    

 

图 2‑2

         appender的配置相对比较简单,除了过滤器,没有特殊要注意的。

3   配置logger

       图3-1是两种looger配置。

 

图 3‑1

         logger的name属性指代的是程序包路径,不用赘述。additivity属性,表示是否遵循缺省的继承机制。

         需要注意:

         1如果我们配置了true,那我们最好不要再给该logger配置appender-ref属性,除非被配置的appender-ref我们没有继续添加在root的appender-ref中,否则我们会发现日志重复。

         2如果我们配置了false,那就必须为该logger配置appender-ref,否则日志不会被打印。

4   配置root

       图4-1是一个标准的root配置。

 

图 4‑1

         

root的作用是是收集所有配置的logger(additivity=true)反馈上来的信息流并且根据root中配置的appender-ref进行输出,所以,如果我们logger配置了additivity=true,又配置了appender-ref,会导致日志重复。

         注意:这里的level值对那些没有配置日志级别,而且additivity=true的logger才会有作用。

下面是具体的配置信息:

 

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >

   <!--对于ConsoleAppender来说,在开发阶段还是比较有用的,能直接在ide中看到输出的日志内容,
   但是在实际的产品阶段,我们更希望将日志输出到指定的文件上查看,这就需要用到FileAppender-->
   <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
      <param name="encoding" value="UTF-8" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %t %l %m%n" />
      </layout>
      <!--如果有过滤器,当前appender只会处理满足过滤器条件的日志信息-->
      <!--<filter class="org.apache.log4j.varia.LevelRangeFilter">
         <param name="levelMin" value="DEBUG" />
         <param name="levelMax" value="FATAL" />
         <param name="AcceptOnMatch" value="true" />
      </filter>-->
   </appender>

   <!-- 写到远端日志 -->
   <appender name="DEFAULT-APPENDER-REMOTE" class="org.apache.log4j.net.SyslogAppender">
      <param name="SyslogHost" value="${logServer}"/> 
       <param name="Facility" value="LOCAL1"/>
          <param name="FacilityPrinting" value="true"/>
       <layout class="org.apache.log4j.PatternLayout">
           <param name="ConversionPattern" value="%d %-5p %t %c %m%n" />
       </layout> 
   </appender>
   
   <appender name="FRAMEWORK-APPENDER-REMOTE" class="org.apache.log4j.net.SyslogAppender">
      <param name="SyslogHost" value="${logServer}"/> 
       <param name="Facility" value="LOCAL3"/>
          <param name="FacilityPrinting" value="true"/>
       <layout class="org.apache.log4j.PatternLayout">
           <param name="ConversionPattern" value="%d %-5p %t %c %m%n" />
       </layout> 
   </appender>
   <!-- 写到本地日志 -->
   <!--第一步:配置appender-->
   <appender name="INFO-LOCAL" class="org.apache.log4j.DailyRollingFileAppender">
      <param name="file" value="/opt/logs/info.log" />
      <param name="append" value="true" /><!--一般必须配置true,否则会覆盖而不是累加-->
      <param name="encoding" value="UTF-8" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %t %l %m%n" />
      </layout>
      <!--如果有过滤器,日志文件中就只会有符合过滤器的日志信息-->
      <filter class="org.apache.log4j.varia.LevelRangeFilter">
         <param name="levelMin" value="DEBUG" />
         <param name="levelMax" value="INFO" />
         <param name="AcceptOnMatch" value="true" />
      </filter>
   </appender>
   <appender name="ERROR-LOCAL" class="org.apache.log4j.DailyRollingFileAppender">
      <param name="file" value="/opt/logs/error.log" />
      <param name="append" value="true" /><!--一般必须配置true,否则会覆盖而不是累加-->
      <param name="encoding" value="UTF-8" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %t %l %m%n" />
      </layout>
      <!--如果有过滤器,日志文件中就只会有符合过滤器的日志信息-->
      <filter class="org.apache.log4j.varia.LevelRangeFilter">
         <param name="levelMin" value="WARN" />
         <param name="levelMax" value="FATAL" />
         <param name="AcceptOnMatch" value="true" />
      </filter>
   </appender>

   <!--第二步:配置logger。
   如果不配置,系统会采用默认策略,即additivity="true",level value="DEBUG"。
   注意:additivity=true,表示遵循缺省的继承机制,此时就不应该继续配置appender-ref,否则日志会出现重复
   相反,如果additivity=false,就必须要配置appender-ref,否则日志不会被打印,配置也就没有意义-->
   <logger name="com.test.log4j" additivity="true">
      <!--给具体的logger配置日志级别,比如com.test包下面日志级别大于等于DEBUG的,
      才会交给appender进行处理。
      注意:对于com.test包而言,此处的级别会覆盖root下面的日志级别-->
      <level value="INFO" />
      <!--如果此处配置了append-ref,而且additivity="true",将会和root里面的同一个
      append-ref形成累加,即重复日志-->
      <!--<appender-ref ref="CONSOLE" />-->
      <!--<appender-ref ref="DEFAULT-LOCAL"/>-->
      <!--<appender-ref ref="ERROR-LOCAL"/>-->
   </logger>
   <logger name="com.test2" additivity="false">
      <level value="INFO" />
      <appender-ref ref="INFO-LOCAL" />
   </logger>

   <!--第三步:配置root-->
   <!--root的作用是收集所有配置的logger反馈上来的信息流并根据配置在root中appender进行输出,
   只要你在looger中配置了additivity="false",就不会反馈到root中。-->
   <root>
      <!--优先级小于具体的logger中配置的级别,只有当具体的logger没有配置的时候,
      这里才会对具体的looger起作用-->
      <level value="DEBUG" />
      <appender-ref ref="CONSOLE" />
      <appender-ref ref="INFO-LOCAL" />
      <appender-ref ref="ERROR-LOCAL"/>
   </root>
</log4j:configuration>  

 

 

二、log4j.properties设置

 

log4j.properties参数详解

log的级别分为debug(调试信息)、info(一般信息)、warn(警告信息)、error(错误信息)、fatal(致命错误信息)。  
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是java属性文件log4j.properties,下面以log4j.properties为例进行说明。  

1、配置根Logger 

Logger 负责处理日志记录的大部分操作,其语法为:  

   log4j.rootLogger = [ level ] , appenderName1, appenderName2, …  

         level : 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。  

       appenderName:就是指定日志信息输出目的地的名称。  

    如:log4j.rootLogger=info,A1,B2,C3   

    在早期log4j版本中,org.apache.Category实现了记录器的功能,后使用logger扩展了Category类,因此log4j.rootCategory也可以使用。  

    如:log4j.rootCategory=INFO,A1,A2  

2、配置日志信息输出目的地 Appender 

Appender 负责控制日志记录操作的输出,其语法为:  

   log4j.appender.appenderName = fully.qualified.name.of.appender.class    

   其中"fully.qualified.name.of.appender.class" 有以下几种:  
          i.org.apache.log4j.ConsoleAppender(控制台)  

                该选项有以下几种:  

                    Threshold=WARN:指定日志消息的输出最低层次。  
                    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。  
                    Target=System.err:默认情况下是:System.out,指定输出控制台  
          ii.org.apache.log4j.FileAppender(文件)  

                该选项有以下几种:  

                    Threshold=WARN:指定日志消息的输出最低层次。  
                    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。  
                    File=mylog.txt:指定消息输出到mylog.txt文件。  
                    Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。  
          iii.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)  

                该选项有以下几种:  

                    Threshold=WARN:指定日志消息的输出最低层次。  
                    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。  
                    File=a.log:指定消息输出到a.log文件,默认是从web服务器的根路径开始。  
                    Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。  
                    DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:  
                        '.'yyyy-MM: 每月  
                        '.'yyyy-ww: 每周   
                        '.'yyyy-MM-dd: 每天  
                        '.'yyyy-MM-dd-a: 每天两次  
                        '.'yyyy-MM-dd-HH: 每小时  
                        '.'yyyy-MM-dd-HH-mm: 每分钟  
          iv.org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件,可通过log4j.appender.appenderName.MaxFileSize=100KB设置文件大小)  

               该选项有以下几种:                      

                    Threshold=WARN:指定日志消息的输出最低层次。  
                    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。  
                    File=a.log:指定消息输出到a.log文件,默认是从web服务器的根路径开始。  
                    Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。  
                    MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。  
                    MaxBackupIndex=2:指定可以产生的滚动文件的最大数。  
          v.org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)  
                      

    例如:  

            log4j.appender.R=org.apache.log4j.DailyRollingFileAppender  
            log4j.appender.R.File=D:\\eclipsespace\\testSSH\\WebContent\\WEB-INF\\testlog.log  

3、配置日志信息的格式(布局)Layout 

Layout 负责格式化Appender的输出,其语法为:  
  log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class  
        其中"fully.qualified.name.of.layout.class" 有以下几种:  
           i.org.apache.log4j.HTMLLayout(以HTML表格形式布局)  
                 该选项有以下几种:  
                      LocationInfo=true:默认值是false,输出java文件名称和行号  
                      Title=my app file: 默认值是 Log4J Log Messages.  
         ii.org.apache.log4j.PatternLayout(可以灵活地指定布局模式)  
                 该选项有以下几种:  
                      ConversionPattern=%m%n :指定怎样格式化指定的消息  
                      其中%m%n等符号所代表的含义如下:  
                      -X号: X信息输出时左对齐;  
                        %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,  
                        %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921  
                        %r: 输出自应用启动到输出该log信息耗费的毫秒数  
                        %c: 输出日志信息所属的类目,通常就是所在类的全名  
                        %t: 输出产生该日志事件的线程名  
                        %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)  
                        %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。  
                        %%: 输出一个"%"字符  
                        %F: 输出日志消息产生时所在的文件名称  
                        %L: 输出代码中的行号  
                        %m: 输出代码中指定的消息,产生的日志具体信息  
                        %n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行  
                        可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:  
                        %20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。  
                        %-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。  
                        %.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。  
                        %20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。  
                        如:%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n  
                            [TEST] %p [%t] %C.%M(%L) | %m%n  
         iii.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)  
         iv.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)  

4.其他 

log4j.logger.com. neusoft =DEBUG  
指定com.neusoft包下的所有类的等级为DEBUG。 

log4j.logger.com.opensymphony.oscache=ERROR  
log4j.logger.net.sf.navigator=ERROR  

这两句是把这两个包下出现的错误的等级设为ERROR,如果项目中没有配置EHCache,则不需要这两句。   

log4j.logger.org.apache.commons=ERROR  
log4j.logger.org.apache.struts=WARN  

这两句是struts的包。  

log4j.logger.org.displaytag=ERROR  

这句是displaytag的包。(QC问题列表页面所用)    

log4j.logger.org.springframework=DEBUG  
此句为Spring的包。  

log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN  

log4j.logger.org.hibernate=DEBUG 

Spring jdbc 打印日志

log4j.logger.org.springframework.jdbc.core.JdbcTemplate=debug
log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=Trace

此两句是hibernate的包。

三、将log写入多个文件中。

log4j配置:

log4j.rootLogger=info,stdout,info,debug,error
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n
 
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold = INFO 
log4j.appender.info.append=true
log4j.appender.info.File=${webApp.root}/WEB-INF/logs/info.log
 
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n
log4j.appender.debug.datePattern='.'yyyy-MM-dd
log4j.appender.debug.Threshold = DEBUG 
log4j.appender.debug.append=true
log4j.appender.debug.File=${webApp.root}/WEB-INF/logs/debug.log
 
log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n
log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold = ERROR   ## 输出DEBUG级别以上的日志
log4j.appender.error.append=true
log4j.appender.error.File=${webApp.root}/WEB-INF/logs/error.log 
 

而实际上这部分代码解决不了按照LOG4J的级别文件进行文件输出。

配置中关键的配置说明是这一句:

log4j.appender.debug.Threshold = INFO
 

mybaties打印sql

二、配置log4j的配置文件。

不同的项目中,log4j的配置文件的格式可能不同,在一些项目中,log4j的配置文件是XML格式的,比如log4j.xml;在另一些项目中,log4j的配置文件是properties格式的,比如log4j.properties。

备注:properties格式文件的配置一般只在老的项目中存在,新的互联网类项目,一般都是XML格式。

1、对于properties格式文件的配置。

按 Ctrl+C 复制代码

 

按 Ctrl+C 复制代码

2、对于xml格式文件的配置。

复制代码

 1 <loggers>
 2     <!-- name可以指定包名或具体的类;additivity如果指定true,则root logger也会生效,相同日志会输出两次;false,则只有当前日志文件输出 -->
 3     <!-- 借据插入接口日志 -->
 4     <logger level="info" name="insertCreditBill" additivity="false">
 5         <appender-ref ref="insertCreditBillLog" />
 6     </logger>                                
 7     
 8     <!-- 下面是打印通过log4j2打印出mybatis语句的配置-->
 9     <logger name="com.xxx.mydao">
10         <level>DEBUG</level>
11     </logger>
12     <logger name="com.springframework">
13         <level>DEBUG</level>
14     </logger>                        
15     <logger name="com.ibatis" additivity="true"> 
16         <level>DEBUG</level> 
17     </logger>
18     <logger name="com.ibatis.common.jdbc.SimpleDataSource" additivity="true"> 
19         <level>DEBUG</level> 
20     </logger>        
21     <logger name="com.ibatis.common.jdbc.ScriptRunner" additivity="true"> 
22         <level>DEBUG</level>
23     </logger>    
24     <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" additivity="true"> 
25         <level>DEBUG</level>
26     </logger>                             
27     <logger name="Java.sql.Connection" additivity="true">  
28         <level>DEBUG</level>
29     </logger> 
30     <logger name="java.sql.Statement" additivity="true"> 
31         <level>DEBUG</level>
32     </logger> 
33     <logger name="java.sql.PreparedStatement" additivity="true"> 
34         <level>DEBUG</level>
35     </logger> 
36     <logger name="java.sql.ResultSet" additivity="true"> 
37         <level>DEBUG</level>
38     </logger>     
39     <logger name="org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl" additivity="true"> 
40         <level>DEBUG</level>
41     </logger>                     
42     
43     <!-- root logger,任何其它的logger最终都相当于继承自 root logger -->
44     <root level="INFO">
45         <appenderRef ref="Console" />
46         <appenderRef ref="FileLog"></appenderRef>
47     </root>
48 </loggers>

复制代码

说明:

上述配置中,“com.xxx.mydao”为自己项目中MyBatis的所有的mapper和xml文件所在的包名字。

至此,log4j的打印SQL语句的配置完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值