RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:9:30-18:00
你可能遇到了下面的问题
关闭右侧工具栏
Log4j是Apache的开源项目
  • 作者:zhaozj
  • 发表时间:2020-12-23 10:38
  • 来源:未知

简介 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文件的格式。 &sup2; 配置根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 &sup2; 配置日志输出目的地的语法是:         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 &sup2; 配置输出信息的格式(布局),其语法为:         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 &Oslash; 灵活定义输出格式,具体可以参看 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          &Oslash; 输出到文件,如下: 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