Log4j是Apache的一个开放源代码项目,通过使用Log4j,控制日志信息输送的目的地可以为控制台、文件、数据库、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;可以控制每一条日志的信息内容和信息输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程;甚至还可以在不需要修改业务逻辑代码、重启web服务,只需要通过一个修改配置文件就可以实现控制项目的日志动作。
结合日志的级别,可以将不同级别的日志信息输送到不同的位置作为记录或者事后查找问题作为依据。一般的信息可以通过文件或者数据库的形式存储,错误信息可以发送邮件给相关的负责人或者发短信报警给相关的负责人,这些在log4j看来轻松搞定。此刻,已经觉得Java轻松做掉了PHP需要花费大量工作才能搞定的事情。
这里,我将log4j.properties配置文件存放到classpath的conf目录下,并启动一个watchdog线程每5秒扫描配置文件的变化,重新调整日志的策略,实现在不调整逻辑代码即可实现日志的策略变更。通过log4j.properties详细配置了日志的策略,如下:
-
1 # +======================================================================+#
-
2 log4j.rootLogger=${log4j.log.level},${log4j.log.target}
-
3 log4j.addivity.org.apache=true
-
4 # +======================================================================+#
-
5 # | [target] - Console
-
6 # +----------------------------------------------------------------------+#
-
7 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
-
8 log4j.appender.CONSOLE.Threshold=${log4j.log.level}
-
9 log4j.appender.CONSOLE.Encoding=${log4j.log.encoding}
-
10 log4j.appender.CONSOLE.Target=System.out
-
11 log4j.appender.CONSOLE.layout=${log4j.log.layout}
-
12 log4j.appender.CONSOLE.layout.ConversionPattern=${log4j.log.layout.pattern}
-
13 # +======================================================================+#
-
14 # | [target] - FILE
-
15 # +----------------------------------------------------------------------+#
-
16 log4j.appender.FILE=org.apache.log4j.RollingFileAppender
-
17 log4j.appender.FILE.Threshold=${log4j.log.level}
-
18 log4j.appender.FILE.Encoding=${log4j.log.encoding}
-
19 log4j.appender.FILE.File=${log4j.log.dir}/runtime.log
-
20 log4j.appender.FILE.Append=true
-
21 log4j.appender.FILE.MaxFileSize=2048KB
-
22 log4j.appender.FILE.MaxBackupIndex=10
-
23 log4j.appender.FILE.layout=${log4j.log.layout}
-
24 log4j.appender.FILE.layout.ConversionPattern=${log4j.log.layout.pattern}
-
25 # +======================================================================+#
-
26 # | [target] - DATABASE
-
27 # +----------------------------------------------------------------------+#
-
28 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
-
29 log4j.appender.DATABASE.Threshold=ERROR
-
30 log4j.appender.DATABASE.URL=jdbc:mysql://127.0.0.1:3306/spring
-
31 log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
-
32 log4j.appender.DATABASE.user=root
-
33 log4j.appender.DATABASE.password=liuriqi
-
34 log4j.appender.DATABASE.layout=${log4j.log.layout}
-
35 log4j.appender.DATABASE.sql=INSERT INTO tv_log4j(message)VALUES('${log4j.log.layout.pattern}')
-
36 # +======================================================================+#
-
37 # | [target] - EMAIL
-
38 # +----------------------------------------------------------------------+#
-
39 log4j.appender.EMAIL=org.apache.log4j.net.SMTPAppender
-
40 log4j.appender.EMAIL.Threshold=FATAL
-
41 log4j.appender.EMAIL.BufferSize=10
-
42 log4j.appender.EMAIL.From=fromuser@gmail.com
-
43 log4j.appender.EMAIL.SMTPHost=localhost
-
44 log4j.appender.EMAIL.Subject=Log4J Message
-
45 log4j.appender.EMAIL.To=touser@gmail.com
-
46 log4j.appender.EMAIL.layout=${log4j.log.layout}
-
47 log4j.appender.EMAIL.layout.ConversionPattern=${log4j.log.layout.pattern}
-
48 # +======================================================================+#
-
49 上面配置相关的变量,我提取出来统一放到变量配置文件里边,如下:
-
50
-
51 # +======================================================================+#
-
52 # | log4j config
-
53 # +----------------------------------------------------------------------+#
-
54 log4j.log.dir=logs/
-
55 #log4j.log.level=ALL,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF
-
56 log4j.log.level=DEBUG
-
57 #log4j.log.target=CONSOLE,FILE,DATABASE,EMAIL,SOCKET
-
58 log4j.log.target=CONSOLE,FILE
-
59 log4j.log.encoding=UTF-8
-
60 log4j.log.layout=org.apache.log4j.PatternLayout
-
61 log4j.log.layout.pattern=[%d %r] [%-5p] [%t] [%l] [%m]%n
-
62 # +======================================================================+#
最后,可以在应用程序中采用log4j自带的debug()、info()、warn()、error()方法来记录你想要记录的操作,至于如何存储日志及日志的目的地发送的工作就交给log4j好了。
最后一点说明的问题:配置较低级别的错误日志策略会记录高级的错误信息,配置高级的错误日志策略会忽略低级错误信息。如将错误日志的level配置为debug,则log4j组件会记录包含debug以上所有的级别日志如debug、info、warn、error、fatal等。加入你配置的为error级别,则不会记录error以下级别的日志信息如debug、info、warn等等。