聊聊log4j

概要

最近在学习 Zookeeper 的时候,遇到了不少问题,想要在控制台中查看日志但是记录却死活不显示,于是找到了 /etc/zookeeper/log4j.properties 文件,但发现配置选项看不懂,想到之前在写 Web 应用的时候也是拿来就用,都没涉及到日志配置文件这一层面,所以打算整理一番。

log4j 是一个用 Java 编写的可靠,快速和灵活的日志框架(API),它在 Apache 软件许可下发布。log4j 是高度可配置的,并可通过在运行时的外部文件配置。它根据记录的优先级别,并提供机制,以指示记录信息到许多的目的地,诸如:数据库,文件,控制台,UNIX 系统日志等。

与 slf4j 的关系

在实际开发当中,常常有人提醒我们,要使用 slf4j 来记录日志,为什么呢?

下面是 sl4fj 官网的介绍。

The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at deployment time.

slf4j(Simple Logging Facade For Java,Java 简易日志门面)是一套封装 Logging 框架的抽象层,而 log4j 是 slf4j 下一个具体实现的日志框架,其中还有许许多多的成熟的日志框架,如 logback 等,也是从属于 slf4j。

使用 slf4j 可以在应用层中屏蔽底层的日志框架,而不需理会过多的日志配置、管理等操作。

如何配置

log4j 配置文件的基本格式如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
#配置根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] - 日志输出级别,可分为以下级别(级别程度从上到下递增):
级别 描述
ALL 所有级别,包括定制级别。
TRACE 比 DEBUG 级别的粒度更细。
DEBUG 指明细致的事件信息,对调试应用最有用。
INFO 指明描述信息,从粗粒度上描述了应用运行过程。
WARN 指明潜在的有害状况。
ERROR 指明错误事件,但应用可能还能继续运行。
FATAL 指明非常严重的错误事件,可能会导致应用终止执行。
OFF 最高级别,用于关闭日志。
  • Appender - 日志输出目的地,常用的 Appender 有以下几种:
Appender 作用
org.apache.log4j.ConsoleAppender 输出至控制台
org.apache.log4j.FileAppender 输出至文件
org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件
org.apache.log4j.RollingFileAppender 文件容量到达指定大小时产生一个新的文件
org.apache.log4j.WriterAppender 将日志信息以输出流格式发送到任意指定地方
  • Layout - 日志输出格式,常用的 Layout 有以下几种:
Layout 作用
org.apache.log4j.HTMLLayout 以 HTML 表格形式布局
org.apache.log4j.PatternLauout(常用) 以格式化的方式定制布局
org.apache.log4j.SimpleLayout 包含日志信息的级别和信息字符串
org.apache.log4j.TTCCLayout 包含日志所在线程、产生时间、类名和日志内容等
  • 打印参数(格式化输出格式,一般对应于 org.apache.log4j.PatternLauout)
参数 作用
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名。%c{1} 可取当前类名称
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式。标准格式为 %d{yyyy-MM-dd HH:mm:ss}
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
  • option - 可选配置。一般来说每个 Appender 或者 Layout 都有默认配置,用户使用自定义日志配置,如指定输出地点等。常用的 option 有以下几种:
参数 作用
file 日志输出至指定文件
thresold 定制日志消息的输出在不同 level 时的行为,
append 是否追加至日志文件中

参考资料:

Log4J 教程 - 极客学院

log4j.properties配置详解