简介
Log4j是Apache的开源项目。通过使用Log4j,我们可以控制日志输入信息到控制台,文件,GUI组件,甚至是套接口服务器,NT的事件记录器,UNIX sysLog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志的生成级别,我们能够更加细致的生成日志的生成过程。这些都可以在通过一个配置文件来灵活配置,而不用修改应用代码。通过Log4j其他语言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
配置
Log4的配置非常简单。只需要将从Apache网站上down下来的log4j-1.2.8.jar(这里介绍的是1.2.8版本)拷贝到相应服务器的lib目录下,如Tomcat可以是common/lib下,也可以是你要用到Log4j的webapps的lib目录下。
配置文件说明
Log4j支持两种配置格式文件:一种是XML格式的文件,一种是java的property文件。下面我们介绍的是property文件的格式。
² 配置根Logger,其语法为log4j.rootLogger=[level], appendName, appendName, …..
其中,level是日志记录的优先级别,分为OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL或者自定义级别。Log4j只建议使用四个级别,优先级别从高到低分别是ERROR, WARN, INFO, DEBUG。如果定义为INFO,则应用程序中所有DEBUG级别的信息将不被打印出来。
appendName是指指定日志信息输出的目的地,可以同时指定多个。
如:log4j.rootLogger=INFO, A1 ,R
² 配置日志输出目的地的语法是:
log4j.appender.appenderName = fully qualified name of appender class
log4j.appender.appenderName.option1 = value1
….
log4j.appender.appenderName.optionN = 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.A1=org.apache.log4j.ConsoleAppender
² 配置输出信息的格式(布局),其语法为:
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(包含日志产生的时间、线程、类别等等信息)
如:
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
Ø 灵活定义输出格式,具体可以参看
log4j javadoc org.apache.log4j.PatternLayout
如下面格式:
log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n%p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n%c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n
Ø 输出到文件,如下:
log4j.appender.R=org.apache.log4j.RollingFileAppender
日志文件的名称:
log4j.appender.R.File=log4jExample.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
在从Apache网站中有大量的这些配置的例子,可以参看一下,在这就不列出来啦J .
log4j在程序中的使用
1. 指明配置文件
PropertyConfigurator.configure(配置文件路径);
当然,你也可以写一个servlet程序,让服务一起来就初始化该配置,不用在每个程序里都添加这一行。如:
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("/"screen.width/2)this.width=screen.width/2" vspace=2 border=0>;
String file = getInitParameter("log4j"screen.width/2)this.width=screen.width/2" vspace=2 border=0>;
if(file != null)
{
PropertyConfigurator.configure(prefix+file);
}
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
{
}
}
当然只写上面这段小程序是不够的,还要在web.xml文件里添加上
<servlet>
<servlet-name>log4j</servlet-name>
<description>no description</description>
<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>
</servlet>
2. 获取日志记录器
必须在使用前要把这个类导入
import org.apache.log4j.Logger;
static Logger logger = Logger.getLogger (string name) ;
name一般是类文件的名字,如ResumeServlet.class.getName()
3. 将不同优先级别的日志记录语句插入到想要记录日志的任何地方,语法如下:
logger.debug ( Object message screen.width/2)this.width=screen.width/2" vspace=2 border=0> ;
logger.info(Object message);
logger.warn(Object message);
logger.error(Object message);
为什么要分级别呢?我们在写程序的时候,为调试程序,会在程序很多会出错的地方加入大量的logger.info()信息,当然,程序调试完毕后我们不需要输出这些信息了。那该怎么办呢?以前的做法是把logger.info()删掉,但这是不现实的。如果程序不大还可以,但如果程序很多,做起来就非常麻烦了。但因为log4j分级别了,但我们不需要输出这些调试用的logger.info()的时候,我们把输出级别调高,如调到warn或error级别,这样info级别及以下级别就不会输出了,这是不是很方便呢?
特例
一些应用服务器也采用了log4j来进行日志记录,比如jboss。但我们也用了log4j并且配置文件级别和服务器不一样,一般来说,系统会以服务器的配置文件为主,当然我们可以修改他们的配置文件来达到我们要求,但一般不建议这么做。服务器上配置文件的level一般是info以上,所以基本也满足我们的要求,一些调试用的信息可以设置到debug级别即可。当然,这个时候,上面第一步的“指明配置文件”我们就可以省略啦J
以jboss为例,在${jboss.server.home.dir}/conf目录下的log4j.xml为日志的配置文件。大家可以修改此配置文件。当然也可在不修改的基础上增加我们自己的配置。可以增加appender,但一般只增加非控制台的appender(如果增加控制台的appender,则控制台会将分别输出服务器原有定义的控制台appender的级别日志记录信息和我们增加的控制台appernder级别日志记录信息,这会造成信息的重复输出,所以不建议增加控制台的appender),如输出appender为文件。然后在<root>标签下增加appender-ref>
<appender>
<param name="Append" value="true"/>
….
</appernder>
这里Append为true表示服务器重启时日志记录信息从上次记录末尾处写入,false为从文件的开头写起
<appender name="myJSR77" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="WARN"/>
<param name="Append" value="true"/>
<param name="File" value="${jboss.server.home.dir}/log/myjsr77.log"/>
<param name="MaxFileSize" value="10KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>
这里表示日志记录文件文件最大容量为10KB,一旦超过会增加一个备份文件。这里备份文件最多只有2个,名字分别为myjsr77.log.1和myjsr77.log.2,这三个日志记录文件内容的新旧程度从新到旧排列为myjsr77.log ,myjsr77.log.1,myjsr77.log.2
Log4j是Apache的开源项目。通过使用Log4j,我们可以控制日志输入信息到控制台,文件,GUI组件,甚至是套接口服务器,NT的事件记录器,UNIX sysLog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志的生成级别,我们能够更加细致的生成日志的生成过程。这些都可以在通过一个配置文件来灵活配置,而不用修改应用代码。通过Log4j其他语言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
配置
Log4的配置非常简单。只需要将从Apache网站上down下来的log4j-1.2.8.jar(这里介绍的是1.2.8版本)拷贝到相应服务器的lib目录下,如Tomcat可以是common/lib下,也可以是你要用到Log4j的webapps的lib目录下。
配置文件说明
Log4j支持两种配置格式文件:一种是XML格式的文件,一种是java的property文件。下面我们介绍的是property文件的格式。
² 配置根Logger,其语法为log4j.rootLogger=[level], appendName, appendName, …..
其中,level是日志记录的优先级别,分为OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL或者自定义级别。Log4j只建议使用四个级别,优先级别从高到低分别是ERROR, WARN, INFO, DEBUG。如果定义为INFO,则应用程序中所有DEBUG级别的信息将不被打印出来。
appendName是指指定日志信息输出的目的地,可以同时指定多个。
如:log4j.rootLogger=INFO, A1 ,R
² 配置日志输出目的地的语法是:
log4j.appender.appenderName = fully qualified name of appender class
log4j.appender.appenderName.option1 = value1
….
log4j.appender.appenderName.optionN = 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.A1=org.apache.log4j.ConsoleAppender
² 配置输出信息的格式(布局),其语法为:
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(包含日志产生的时间、线程、类别等等信息)
如:
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
Ø 灵活定义输出格式,具体可以参看
log4j javadoc org.apache.log4j.PatternLayout
如下面格式:
log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n%p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n%c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n
Ø 输出到文件,如下:
log4j.appender.R=org.apache.log4j.RollingFileAppender
日志文件的名称:
log4j.appender.R.File=log4jExample.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
在从Apache网站中有大量的这些配置的例子,可以参看一下,在这就不列出来啦J .
log4j在程序中的使用
1. 指明配置文件
PropertyConfigurator.configure(配置文件路径);
当然,你也可以写一个servlet程序,让服务一起来就初始化该配置,不用在每个程序里都添加这一行。如:
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("/"screen.width/2)this.width=screen.width/2" vspace=2 border=0>;
String file = getInitParameter("log4j"screen.width/2)this.width=screen.width/2" vspace=2 border=0>;
if(file != null)
{
PropertyConfigurator.configure(prefix+file);
}
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
{
}
}
当然只写上面这段小程序是不够的,还要在web.xml文件里添加上
<servlet>
<servlet-name>log4j</servlet-name>
<description>no description</description>
<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>
</servlet>
2. 获取日志记录器
必须在使用前要把这个类导入
import org.apache.log4j.Logger;
static Logger logger = Logger.getLogger (string name) ;
name一般是类文件的名字,如ResumeServlet.class.getName()
3. 将不同优先级别的日志记录语句插入到想要记录日志的任何地方,语法如下:
logger.debug ( Object message screen.width/2)this.width=screen.width/2" vspace=2 border=0> ;
logger.info(Object message);
logger.warn(Object message);
logger.error(Object message);
为什么要分级别呢?我们在写程序的时候,为调试程序,会在程序很多会出错的地方加入大量的logger.info()信息,当然,程序调试完毕后我们不需要输出这些信息了。那该怎么办呢?以前的做法是把logger.info()删掉,但这是不现实的。如果程序不大还可以,但如果程序很多,做起来就非常麻烦了。但因为log4j分级别了,但我们不需要输出这些调试用的logger.info()的时候,我们把输出级别调高,如调到warn或error级别,这样info级别及以下级别就不会输出了,这是不是很方便呢?
特例
一些应用服务器也采用了log4j来进行日志记录,比如jboss。但我们也用了log4j并且配置文件级别和服务器不一样,一般来说,系统会以服务器的配置文件为主,当然我们可以修改他们的配置文件来达到我们要求,但一般不建议这么做。服务器上配置文件的level一般是info以上,所以基本也满足我们的要求,一些调试用的信息可以设置到debug级别即可。当然,这个时候,上面第一步的“指明配置文件”我们就可以省略啦J
以jboss为例,在${jboss.server.home.dir}/conf目录下的log4j.xml为日志的配置文件。大家可以修改此配置文件。当然也可在不修改的基础上增加我们自己的配置。可以增加appender,但一般只增加非控制台的appender(如果增加控制台的appender,则控制台会将分别输出服务器原有定义的控制台appender的级别日志记录信息和我们增加的控制台appernder级别日志记录信息,这会造成信息的重复输出,所以不建议增加控制台的appender),如输出appender为文件。然后在<root>标签下增加appender-ref>
<appender>
<param name="Append" value="true"/>
….
</appernder>
这里Append为true表示服务器重启时日志记录信息从上次记录末尾处写入,false为从文件的开头写起
<appender name="myJSR77" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="WARN"/>
<param name="Append" value="true"/>
<param name="File" value="${jboss.server.home.dir}/log/myjsr77.log"/>
<param name="MaxFileSize" value="10KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>
这里表示日志记录文件文件最大容量为10KB,一旦超过会增加一个备份文件。这里备份文件最多只有2个,名字分别为myjsr77.log.1和myjsr77.log.2,这三个日志记录文件内容的新旧程度从新到旧排列为myjsr77.log ,myjsr77.log.1,myjsr77.log.2