PHP转Java有一段时间了,最近在学习Spring的一些组件安装、配置及使用。今天学习了log4j作为项目日志操作组件为web开发节省了大量在项目过程中记录日志及日志输送存储的工作。


Log4j是Apache的一个开放源代码项目,通过使用Log4j,控制日志信息输送的目的地可以为控制台、文件、数据库、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;可以控制每一条日志的信息内容和信息输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程;甚至还可以在不需要修改业务逻辑代码、重启web服务,只需要通过一个修改配置文件就可以实现控制项目的日志动作。

首先,日志的级别有:OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE 、ALL 等等。




OFF:关闭了日志信息 


FATAL:可能导致应用中止的严重事件错误 


ERROR:严重错误 主要是程序的错误 


WARN:一般警告,比如session丢失 


INFO:一般要显示的信息,比如登录登出 


DEBUG:程序的调试信息 


TRACE:比DEBUG更细粒度的事件信息 


ALL:打开所有级别的日志



og4j提供了一系列的Appender,允许将日志输送到不同的地方,如控制台、文件、数据库等:


  1. org.apache.log4j.ConsoleAppender(控制台)
  2. org.apache.log4j.FileAppender(文件)
  3. org.apache.log4j.jdbc.JDBCAppender(数据库)
  4. org.apache.log4j.net.SMTPAppender(邮件)
  5. org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
  6. org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
  7. org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

结合日志的级别,可以将不同级别的日志信息输送到不同的位置作为记录或者事后查找问题作为依据。一般的信息可以通过文件或者数据库的形式存储,错误信息可以发送邮件给相关的负责人或者发短信报警给相关的负责人,这些在log4j看来轻松搞定。此刻,已经觉得Java轻松做掉了PHP需要花费大量工作才能搞定的事情。


关于log4j的配置参数请参考网上的资料,下面就简单的讲解如何在Spring框架中整合log4j作为日志的操作组件来服务项目吧:

1. pom.xml 引入log4j组件依赖包:

< dependency >

< 
 groupId 
 >log4j</ 
 groupId 
 > 

 
 
  
 < 
 artifactId 
 >log4j</ 
 artifactId 
 > 

 
 
  
 < 
 version 
 >1.2.15</ 
 version 
 > 

 
 
  
 < 
 exclusions 
 > 

 
 
  
 < 
 exclusion 
 > 

 
 
  
 < 
 groupId 
 >javax.mail</ 
 groupId 
 > 

 
 
  
 < 
 artifactId 
 >mail</ 
 artifactId 
 > 

 
 
  
 </ 
 exclusion 
 > 

 
 
  
 < 
 exclusion 
 > 

 
 
  
 < 
 groupId 
 >javax.jms</ 
 groupId 
 > 

 
 
  
 < 
 artifactId 
 >jms</ 
 artifactId 
 > 

 
 
  
 </ 
 exclusion 
 > 

 
 
  
 < 
 exclusion 
 > 

 
 
  
 < 
 groupId 
 >com.sun.jdmk</ 
 groupId 
 > 

 
 
  
 < 
 artifactId 
 >jmxtools</ 
 artifactId 
 > 

 
 
  
 </ 
 exclusion 
 > 

 
 
  
 < 
 exclusion 
 > 

 
 
  
 < 
 groupId 
 >com.sun.jmx</ 
 groupId 
 > 

 
 
  
 < 
 artifactId 
 >jmxri</ 
 artifactId 
 > 

 
 
  
 </ 
 exclusion 
 > 

 
 
  
 </ 
 exclusions 
 > 

 
 
  
 < 
 scope 
 >runtime</ 
 scope 
 > 

 
 
  
 </ 
 dependency 
 > 

 
2. web.xml里边配置servlet容器启动时,自动加载log4j配置并注入组件:
 
 
 < 
 context-param 
 > 

 
 
  
 < 
 param-name 
 >log4jConfigLocation</ 
 param-name 
 > 
 <!-- log4j 配置文件路径 --> 

 
 
  
 < 
 param-value 
 >classpath:conf/log4j.properties</ 
 param-value 
 > 

 
 
  
 </ 
 context-param 
 > 

 
 
  
 < 
 context-param 
 > 

 
 
  
 < 
 param-name 
 >log4jRefreshInterval</ 
 param-name 
 > 
 <!-- 开一条watchdog线程每5秒扫描一下配置文件的变化 --> 

 
 
  
 < 
 param-value 
 >5000</ 
 param-value 
 > 

 
 
  
 </ 
 context-param 
 > 

 
 
  
 < 
 listener 
 > 

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

 
 
  
 </ 
 listener 
 >



这里,我将log4j.properties配置文件存放到classpath的conf目录下,并启动一个watchdog线程每5秒扫描配置文件的变化,重新调整日志的策略,实现在不调整逻辑代码即可实现日志的策略变更。通过log4j.properties详细配置了日志的策略,如下:


# +======================================================================+# 

 
 
 log4j.rootLogger=${log4j.log.level},${log4j.log.target} 

 
 
 log4j.addivity.org.apache=true 

 
 
 # +======================================================================+# 

 
 
 # | [target] - Console 

 
 
 # +----------------------------------------------------------------------+# 

 
 
 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 

 
 
 log4j.appender.CONSOLE.Threshold=${log4j.log.level} 

 
 
 log4j.appender.CONSOLE.Encoding=${log4j.log.encoding} 

 
 
 log4j.appender.CONSOLE.Target=System.out 

 
 
 log4j.appender.CONSOLE.layout=${log4j.log.layout} 

 
 
 log4j.appender.CONSOLE.layout.ConversionPattern=${log4j.log.layout.pattern} 

 
 
 # +======================================================================+# 

 
 
 # | [target] - FILE 

 
 
 # +----------------------------------------------------------------------+# 

 
 
 log4j.appender.FILE=org.apache.log4j.RollingFileAppender 

 
 
 log4j.appender.FILE.Threshold=${log4j.log.level} 

 
 
 log4j.appender.FILE.Encoding=${log4j.log.encoding} 

 
 
 log4j.appender.FILE.File=${log4j.log.dir}/runtime.log 

 
 
 log4j.appender.FILE.Append=true 

 
 
 log4j.appender.FILE.MaxFileSize=2048KB 

 
 
 log4j.appender.FILE.MaxBackupIndex=10 

 
 
 log4j.appender.FILE.layout=${log4j.log.layout} 

 
 
 log4j.appender.FILE.layout.ConversionPattern=${log4j.log.layout.pattern} 

 
 
 # +======================================================================+# 

 
 
 # | [target] - DATABASE 

 
 
 # +----------------------------------------------------------------------+# 

 
 
 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender 

 
 
 log4j.appender.DATABASE.Threshold=ERROR 

 
 
 log4j.appender.DATABASE.URL=jdbc:< 
 a 
  title 
 = 
 "mysql" 
  href 
 = 
 "http://liuriqi.com/?cat=7" 
 >mysql</ 
 a 
 >://127.0.0.1:3306/spring 

 
 
 log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver 

 
 
 log4j.appender.DATABASE.user=root 

 
 
 log4j.appender.DATABASE.password=liuriqi 

 
 
 log4j.appender.DATABASE.layout=${log4j.log.layout} 

 
 
 log4j.appender.DATABASE.sql=INSERT INTO tv_log4j(message)VALUES('${log4j.log.layout.pattern}') 

 
 
 # +======================================================================+# 

 
 
 # | [target] - EMAIL 

 
 
 # +----------------------------------------------------------------------+# 

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

 
 
 log4j.appender.EMAIL.Threshold=FATAL 

 
 
 log4j.appender.EMAIL.BufferSize=10 

 
 
 log4j.appender.EMAIL.From=fromuser@gmail.com 

 
 
 log4j.appender.EMAIL.SMTPHost=localhost 

 
 
 log4j.appender.EMAIL.Subject=Log4J Message 

 
 
 log4j.appender.EMAIL.To=touser@gmail.com 

 
 
 log4j.appender.EMAIL.layout=${log4j.log.layout} 

 
 
 log4j.appender.EMAIL.layout.ConversionPattern=${log4j.log.layout.pattern} 

 
 
 # +======================================================================+#

上面配置相关的变量,我提取出来统一放到变量配置文件里边,如下:


# +======================================================================+# 

 
 
 # | log4j config 

 
 
 # +----------------------------------------------------------------------+# 

 
 
 log4j.log.dir=logs/ 

 
 
 #log4j.log.level=ALL,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF 

 
 
 log4j.log.level=DEBUG 

 
 
 #log4j.log.target=CONSOLE,FILE,DATABASE,EMAIL,SOCKET 

 
 
 log4j.log.target=CONSOLE,FILE 

 
 
 log4j.log.encoding=UTF-8 

 
 
 log4j.log.layout=org.apache.log4j.PatternLayout 

 
 
 log4j.log.layout.pattern=[%d %r] [%-5p] [%t] [%l] [%m]%n 

 
 
 # +======================================================================+#



最后,可以在应用程序中采用log4j自带的debug()、info()、warn()、error()方法来记录你想要记录的操作,至于如何存储日志及日志的目的地发送的工作就交给log4j好了。

最后一点说明的问题:配置较低级别的错误日志策略会记录高级的错误信息,配置高级的错误日志策略会忽略低级错误信息。如将错误日志的level配置为debug,则log4j组件会记录包含debug以上所有的级别日志如debug、info、warn、error、fatal等。加入你配置的为error级别,则不会记录error以下级别的日志信息如debug、info、warn等等。