log4j详解及简易搭建

log4j是一个非常强大的log记录软件.

首先当然是得到log4j的jar档,推荐使用1.2.X版,下载地址:

http://logging.apache.org/log4j/1.2/download.html

 

下面先来看Log4J的类图

 

Logger - 日志写出器,供程序员输出日志信息 
Appender - 日志目的地,把格式化好的日志信息输出到指定的地方去 
ConsoleAppender - 目的地为控制台的Appender 
FileAppender - 目的地为文件的Appender 
RollingFileAppender - 目的地为大小受限的文件的Appender 
Layout - 日志格式化器,用来把程序员的logging request格式化成字符串 
PatternLayout - 用指定的pattern格式化logging request的Layout


Log4j基本使用方法 


Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显 示内容。

一、定义配置文件(文件名一般用log4j.properties,置于src目录下)

其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)。下面我们介绍使用Java特性文件做为配置文件的方法:

1.配置根Logger,其语法为: 

log4j.rootLogger = [ level ] , appenderName, appenderName, …

其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指B日志信息输出到哪个地方。您可以同时指定多个输出目的地。

2.配置日志信息输出目的地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(将日志信息以流格式发送到任意指定的地方)

3.配置日志信息的格式(布局),其语法为: 

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1

log4j.appender.appenderName.layout.option = valueN

其中,Log4j提供的layout有以e几种:
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 输出产生该日志事件的线程名

%m 日志的内容;
%n 输出一个回车换行符,Windows平台为“rn”,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)、

二、spring方式加载,配置与web.xml中:

Spring加载log4j.properties,它提供了一个Log4jConfigListener,本身就能通过web.xml配置从指定位置加载log4j配置文件和log4j的输出路径,要注意的是

Log4jConfigListener必须要在Spring的Listener之前。

web.xml

<!-- 设置由Sprng载入的Log4j配置文件位置 -->

<context-param> 

    <param-name>log4jConfigLocation</param-name> 

    <param-value>WEB-INF/classes/log4j.properties</param-value> 

</context-param> 

  <!-- Spring刷新Log4j配置文件变动的间隔,单位为毫秒 -->

<context-param> 

    <param-name>log4jRefreshInterval</param-name> 

    <param-value>10000</param-value> 

</context-param> 

 

<listener> 

    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 

</listener>

三、在代码中使用Log4j (后面有实例代码)

1.得到记录器 

使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:

public static Logger getLogger( String name)

通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:

static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

2.读取配置文件(当properties文件名为: log4j.properties 且置于src文件下时,可省略此步骤,系统会自动加载该文件)
当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。
PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。

 

DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。

3.插入记录信息(格式化日志信息) 

当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:
logger.trace( Object message) ;
  logger.debug ( Object message ) ;
logger.info ( Object message ) ;

logger.warn ( Object message ) ;

logger.error ( Object message ) ; 

 

logger.fatal( Object message);

实例代码 

实例1.FileAppender 的PatternLayout样式的配置 

#设置级别和目的地,即输出到file所指向的目的地
log4j.rootLogger = debug , file

#输出到文件
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=project.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout

log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  

 

实例2.ConsoleAppender 的SimpleLayout样式的配置

 
#设置级别和目的地,即out所指向的位置
log4j.rootLogger = debug , out

#指向控制台,采用SimpleLayout
log4j.appender.out = org.apache.log4j.ConsoleAppender
log4j.appender.out.Target=System.out

log4j.appender.out.layout = org.apache.log4j.SimpleLayout  

 

实例3. 组合appender的配置(包括file跟out,名字可自定义),加多一个logger的配置

 
#设置级别和目的地,即输出到file所指向的目的地 (这里设为Info级别,表明只有优先级高于info的才会输出到目的地.例如在这里debug信息不会输出)

log4j.rootLogger = info, file , out 

 

#配置convention日志记录logger级别为DEBUG,最后会使用rootLogger中设定的Appender进行日志输出

log4j.logger.org.apache.struts2.convention=DEBUG

 

#配置hibernate的hbm2dll日志记录级别为DEBUG,输出到out, 即覆盖了父logger--rootLogger的配置

log4j.logger.org.hibernate.tool.hbm2dll=DEBUG , out

 

 

#输出到文件
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=project.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  
 
#指向控制台,采用SimpleLayout
log4j.appender.out = org.apache.log4j.ConsoleAppender
log4j.appender.out.Target=System.out
log4j.appender.out.layout = org.apache.log4j.SimpleLayout  

 

 实例4. JDBCAppender 输出到数据库的配置

 

 
 log4j.rootLogger = error , database
#指向JDBC数据库 , 使用PatternLayout
log4j.appender.database = org.apache.log4j.jdbc.JDBCAppender
#ERROR或者ERROR以上级别输出
log4j.appender.database.Threshold=ERROR
#配置数据库连接信息
log4j.appender.database.URL=jdbc:mysql://localhost:3306/log4j
log4j
.appender.database.driver=com.mysql.jdbc.Driver
log4j
.appender.database.user=root
log4j
.appender.database.password=admin
#配置sql语句
log4j.appender.database.sql=INSERT INTO tb_log (date , priority, message , classname ) VALUES ('%d' , '%p' , '%m' , '%c' )
#配置PatternLayout
log4j.appender.database.layout=org.apache.log4j.PatternLayout
log4j
.appender.database.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss:SSS}  %m
 

 

 

 实例5. 代码中使用Log4j.

 
 package com.mai.test;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Log4jTest {

    public static void main(String[] args) {

        Logger log = Logger.getLogger(Log4jTest.class);
        //这里的路径相对于工程根目录,但假如log4j.properties是置于src目录下,也可以省略此句,因为系统会自动加载该文件
        PropertyConfigurator.configure("src/log4j.properties");
        log.debug("yes,debug");
        log.info("yes,info");
        log.error("yes,error");
        log.warn("yes,warn");
    }

}

 

 输出结果: (这里只配置了out控制台记录器,采用SimpleLayout)

DEBUG - yes,debug

INFO - yes,info

ERROR - yes,error
WARN 
- yes,warn

 下面是配置文件log4j.properties的内容:

log4j.rootCategory=DEBUG, stdout,R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender


log4j.appender.R.File=log.txt
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy MMM dd HH:mm:ss} %-5p %c - %m%n

程序说明:
① log4j.rootCategory=DEBUG, stdout,R
就是说我要显示所有优先权等於和高于Debug的信息。
"stdout",”R”表示我定义了两个输出端(随便什么名字都好)。

②下面的三行说stdout输出端其实是标准输出Console,也就是屏幕。输出的格式是PatternLayout。转换方式是%5p (%F:%L) - %m%n,即前五格用来显示优先权,再显示当前的文件名,加当前的行数。最后是logger.debug()或logger.info()或logger.warn()或logger.error()里的信息。%n表示回车空行。


③再加上下面六行则log信息不光显示在屏幕上,而且将被保存在一个叫"log.txt"的文件里,文件最大为100KB。如果文件大小超过100KB,文件会被备份成"log.txt.1",新的"log.txt"继续记录log信息。

接下来我们可以改变log4j.properties,而不需重新编译就可以控制log信息是否显示、log信息的输出端类型、输出方式、输出格式,等等。举例如下:

①在log4j.properties文件里把"log4j.rootCategory=DEBUG,stdout,R"改写成"log4j.rootCategory=OFF, stdout,R",这样所有的log信息都不会显示了;解决了本文开始提出的问题。
②在log4j.properties文件里把"log4j.rootCategory=DEBUG,stdout,R"改写成"log4j.rootCategory=INFO, stdout,R",这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示;

在web程序中使用log4j注意问题
1、    由于jsp或servlet在执行状态时没有当前路径概念,所有使用PropertyConfigurator.configure(String)语句找log4j.properties文件时要给出相对于当前jsp或servlet的路径转化成为一个绝对的文件系统路径。方法是使用servletcontext.getrealpath(string)语句。例:

//得到当前jsp路径
String prefix =  getServletContext().getRealPath("/");

//读取log4j.properties
PropertyConfigurator.configure(prefix+"\\WEB-INF\\log4j.properties");


2、相应的log4j.properties设置某个属性时也要在程序中设置绝对路径。例:
log4j.appender.R.File属性设置日志文件存放位置。我们可以用读写.properties配置文件的方法进行灵活设置。
log4e使用说明
在了解了log4j的功能后,我们肯定会我们的程序中编写一些Log4j日志记录。对于使用Eclipse的程序员Log4e将是我们最得力的log4j日志编写助手,现在开始Log4e之旅。
Log4e是一个免费的Eclipse Plugin,它可帮助你在你的Java工程中快速加入Log; 我们可以在http://log4e.jayefem.de/index.php/Download网站上下载Log4e最新版本。下载后将相应文件夹拷贝到Eclipse的插件目录下,重新Eclipse,在首选项中会多出一个Log4e选项。
Log4e可以有多个插入Log为一个方法、类,当然也可以在当前位置插入Log,同时其也可以把Sysout.out.println()的转换为log;所有的这一切只需要你点点鼠标或者按一次快捷键.

posted @ 2012-12-05 15:40  小嫩芽儿  阅读(526)  评论(0编辑  收藏  举报