Log4j 是 Apache 的一个开源项目 , 通过使用 Log4j , 我们可以控制日志信息输送的目的地是控制台 , 文件 , GUI 组件 , 甚至是套接口服务器 , NT 的事件记录器 , UNIX Syslog 守护进程等 ; 我们也可以控制每一条日志的输出格式 ; 通过定义每一条日志信息的级别 , 我们能够更加细致地控制日志的生成过程 ; 最令人感兴趣的就是 , 这些可以通过一个配置文件来灵活地进行配置 , 而不需要修改应用的代码
本文提到的 Log4j 版本是 1.x , 官方最新版本是 2.x , 比 1.x 性能好很多 , 但配置文件有很大差异 , 暂不赘述
基础配置
-
新建一个 Java 项目 , 在项目
Java Build Path
中Add External JARs
, 添加下载好的 log4j 包 , 我用的版本是 1.2.17 -
新建
Log4jDemo
类文件 , 代码如下 :import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Level; import org.apache.log4j.Logger; public class Log4jDemo { // 基于类的名称获取日志对象 static Logger logger = Logger.getLogger(Log4jDemo.class); public static void main(String[] args) throws InterruptedException { // 进行默认配置 BasicConfigurator.configure(); // 设置日志输出级别 logger.setLevel(Level.DEBUG); // 进行不同级别的日志输出 logger.trace("跟踪信息"); logger.debug("调试信息"); logger.info("输出信息"); // 线程等待 1 秒便于观察前后日志输出的时间差 Thread.sleep(1000); logger.warn("警告信息"); logger.error("错误信息"); logger.fatal("致命信息"); } }
-
输出信息如下 :
DEBUG [main] (Log4jDemo.java:18) - 调试信息 0 [main] DEBUG exp.Log4jDemo - 调试信息 INFO [main] (Log4jDemo.java:19) - 输出信息 2 [main] INFO exp.Log4jDemo - 输出信息 WARN [main] (Log4jDemo.java:22) - 警告信息 1003 [main] WARN exp.Log4jDemo - 警告信息 ERROR [main] (Log4jDemo.java:23) - 错误信息 1003 [main] ERROR exp.Log4jDemo - 错误信息 FATAL [main] (Log4jDemo.java:24) - 致命信息 1003 [main] FATAL exp.Log4jDemo - 致命信息
基于配置文件
-
首先在
src
目录下添加log4j.properties
文件 , 写入如下内容 :## 设置根日志级别 , 输出目的地 log4j.rootLogger=DEBUG,CONSOLE,D ## CONSOLE 目的地输出配置 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n ## D 目的地输出设置 log4j.appender.D=org.apache.log4j.RollingFileAppender log4j.appender.D.File=C:/Users/dayi_wei/Desktop/debug.log log4j.appender.D.MaxFileSize=100KB log4j.appender.D.MaxBackupIndex=5 log4j.appender.D.Threshold=DEBUG log4j.appender.D.layout=org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern=%d [%-5p] %c\:%x%L - %m%n
-
代码文件修改如下 :
import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class Log4jDemo { // 基于类的名称获取日志对象 static Logger logger = Logger.getLogger(Log4jDemo.class); public static void main(String[] args) throws InterruptedException { // 进行基于文件的配置 PropertyConfigurator.configure("F:/Code/Worksapce/messy/messy/src/log4j.properties"); // 进行不同级别的日志输出 logger.trace("跟踪信息"); logger.debug("调试信息"); logger.info("输出信息"); logger.warn("警告信息"); logger.error("错误信息"); logger.fatal("致命信息"); } }
-
如上设置了两个输出目的地 , 控制台和文件 , 控制台打印信息如下 :
DEBUG [main] (Log4jDemo.java:15) - 调试信息 INFO [main] (Log4jDemo.java:16) - 输出信息 WARN [main] (Log4jDemo.java:17) - 警告信息 ERROR [main] (Log4jDemo.java:18) - 错误信息 FATAL [main] (Log4jDemo.java:19) - 致命信息
-
文件里面的信息如下 :
2019-02-22 15:20:12,362 [DEBUG] exp.Log4jDemo:15 - 调试信息 2019-02-22 15:20:12,364 [INFO ] exp.Log4jDemo:16 - 输出信息 2019-02-22 15:20:12,364 [WARN ] exp.Log4jDemo:17 - 警告信息 2019-02-22 15:20:12,364 [ERROR] exp.Log4jDemo:18 - 错误信息 2019-02-22 15:20:12,364 [FATAL] exp.Log4jDemo:19 - 致命信息
-
解释log4j.properties
log4j.rootLogger=DEBUG,CONSOLE,D 设置日志输出的等级为 DEBUG , 低于 DEBUG 就不会输出了 设置日志输出到两种地方 , 分别叫做 CONSOLE 和 D log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 第一个地方 CONSOLE , 输出到控制台 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n 输出格式是 %5p [%t] (%F:%L) - %m%n log4j.appender.D=org.apache.log4j.RollingFileAppender log4j.appender.D.File=C:/Users/dayi_wei/Desktop/debug.log log4j.appender.D.MaxFileSize=100KB log4j.appender.D.MaxBackupIndex=5 log4j.appender.D.Threshold=DEBUG log4j.appender.D.layout=org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern=%d [%-5p] %c\:%x%L - %m%n 第二个地方 D , 以滚动的方式输出到文件 , 文件名是 debug.log , 文件最大100k , 最多滚动 5 个文件 输出格式是 %p %t %c - %m%n
配置文件详解
Log4J 配置文件的基本格式如下 :
# 配置根Logger
log4j.rootLogger = [level] , appenderName1 , appenderName2 , …
# 配置日志信息输出目的地 Appender
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
# 配置日志信息的格式 (布局)
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
[level] 是日志输出级别
分为 OFF , FATAL , ERROR , WARN , INFO , DEBUG , ALL 或者您定义的级别 , 这些级别是从高到低的级别 ; Log4j 建议只使用四个级别 , 优先级从高到低分别是 ERROR , WARN , INFO , DEBUG ; 通过在这里定义的级别 , 您可以控制到应用程序中相应级别的日志信息的开关 ; 比如在这里定义了 INFO级别 , 则应用程序中所有DEBUG级别的日志信息将不被打印出来
Appender 为日志输出目的地 , Log4j 提供的有以下几种 :
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
Layout 为日志输出格式 , Log4j 提供的 layout 有以下几种 :
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 输出产生该日志事件的线程名
%n 输出一个回车换行符 , Windows 平台为 "/r/n" , Unix 平台为 "/n"
%d 输出日志时间点的日期或时间 , 默认格式为ISO8601 , 也可以在其后指定格式
%l 输出日志事件的发生位置 , 包括类目名 , 发生的线程 , 以及在代码中的行数 如 : Testlog4.main(TestLog4.java: 10)
在代码中初始化 Logger
* 在程序中调用 BasicConfigurator.configure()方法 , 给根记录器增加一个ConsoleAppender , 根记录器的默认级别是 Level.DEBUG
* 配置放在文件里 , 通过命令行参数传递文件名字 , 通过 PropertyConfigurator.configure(args[x]) 解析并配置
* 配置放在文件里 , 通过环境变量传递文件名等信息 , 利用 log4j 默认的初始化过程解析并配置
* 配置放在文件里 , 通过应用服务器配置传递文件名等信息 , 利用一个特殊的 servlet 来完成配置
为不同的 Appender 设置日志输出级别
当调试系统时 , 我们往往注意的只是异常级别的日志输出 , 但是通常所有级别的输出都是放在一个文件里的 , 如果日志输出的级别是 DEBUG , 那就慢慢去找吧 ;
这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊 ; 当然可以 , Log4j 已经提供了这样的功能 , 我们只需要在配置中修改 Appender 的 Threshold 就能实现 , 比如下面的例子 :
## D 目的地输出设置
log4j.appender.D=org.apache.log4j.RollingFileAppender
log4j.appender.D.File=C:/Users/dayi_wei/Desktop/debug.log
log4j.appender.D.MaxFileSize=100KB
log4j.appender.D.MaxBackupIndex=5
log4j.appender.D.Threshold=ERROR ## 只输出ERROR级别以上的日志
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%d [%-5p] %c\:%x%L - %m%n
作者 Github : tojohnonly , 博客 : EnskDeCode