概述
记录日志是软件开发中的重要一环。编写良好的日志代码能为运行应用提供快速的诊断信息和良好的存储结构,方便维护。记录日志也有其缺点,它会让应用变慢。假如输出太详细,可能会导致屏幕闪动。为了减轻这些影响,Log4j 被设计为可靠的,更快的和可扩展的。Log4j是一个使用Java语言编写的,可靠、快速、灵活的日志框架(API),是高度可配置的,在运行期使用外部的配置文件进行配置。它按照优先级别记录日志,并可将日志信息定向输出到各种介质,如数据库,控制台,Unix Syslog等。
Log4j主要由三部分组成:
loggers:负责日志信息
appenders:负责将日志信息发布到不同地方
layouts:负责以各种风格格式化日志信息
Log4j的功能
- 线程安全
- 速度优化
- 基于命名的logger层次
- 每个logger支持多种输出appender
- 支持国际化
- 不受限于预定义好的设施
- 日志记录行为可在运行期通过配置文件设置
- 设计之初就考虑了处理Java异常
- 使用多个日志级别:ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL
- 通过扩展layout类可以轻松改变输出日志格式
- 输出日志的目的和策略可通过实现appender接口改变
- 失败即停止
架构
Log4j API采用分层架构,每一层有不同的对象,完成不同的任务。这种分层架构让设计变得灵活,且易于日后扩展。
Log4j里有两种类型的对象:
核心对象:这是框架必须的对象,使用框架时必须用到
支持对象:这是框架的可选对象,它们支持核心对象做一些额外的,但并不重要的任务。
核心对象
核心对象包括如下几种类型:
Logger对象
最上一层Logger对象,该对象负责获取日志信息,并存储于一个分层的命名空间之中。
Layout对象
Layout层提供了用于以各种风格格式日志信息的对象,在发布日志信息之前,它为appender对象提供支持。Layout对象对于发布日志非常重要,它使日志变得可读、可复用。
Appender对象
该对象位于分层架构中的较低一层,Appender对象负责日志信息发布到不同目的地,比如数据库、文件、控制台、Unix Syslog等。
支持对象
Level对象
Level对象定义了日志信息的粒度和优先级。API定义了七种级别:
ALL: 所有级别,包括定制级别
DEBUG: 指明细致的事件信息,对调试应用最有用
ERROR: 指明错误事件,但应用可能还能继续运行
FATAL: 指明非常严重的错误事件,可能会导致应用终止执行
INFO: 指明描述信息,从粗粒度上描述了应用运行过程
OFF: 最高级别,用于关闭日志
TRACE: 比 DEBUG 级别的粒度更细
WARN: 指明潜在的有害状况
Filter对象
Filter对象用来分析日志信息,进而决定该条日志是否被记录。
ObjectRenderer
ObjectRenderer对象负责为传入日志框架的不同对象提供字符串形式的表示,Layout对象使用该对象来准备最终的日志信息。
LogManager
LogManager对象管理日志框架,它负责从系统级的配置文件或类中读取初始配置参数。
配置
Log4j 的配置包括在配置文件中指定 Level、定义 Appender 和指明 Layout。Log4j.properties 文件是 Log4j 的配置文件,属性以键值对的形式定义。默认情况下,LogManager 会在 CLASSPATH 中寻找 Log4j.properties 文件。
# Define the root logger with appender file
Log4j.rootLogger = DEBUG, FILE
# Define the file appender
Log4j.appender.FILE=org.apache.Log4j.FileAppender
Log4j.appender.FILE.File=${log}/log.out
# Define the layout for file appender
Log4j.appender.FILE.layout=org.apache.Log4j.PatternLayout
Log4j.appender.FILE.layout.conversionPattern=%m%n
注意:Log4j 支持 Unix 风格的变量替换,比如 ${variableName}。
实例:
- 根日志的级别定义为 DEBUG,并将名为 X 的 appender 添加其上
- 将名为 X 的 appender 设置为合法的 appender
- 设置 appender X 的 layout
Log4j.properties语法
# Define the root logger with appender X
Log4j.rootLogger = DEBUG, X
# Set the appender named X to be a File appender
Log4j.appender.X=org.apache.Log4j.FileAppender
# Define the layout for X appender
Log4j.appender.X.layout=org.apache.Log4j.PatternLayout
Log4j.appender.X.layout.conversionPattern=%m%n
使用上述语法,我们在 Log4j.properties 定义如下属性:
• 定义根日志级别为 DEBUG,并将名为 FILE 的 appender 添加其上
• appender FILE 定义为 org.apache.Log4j.FileAppender,它将日志写入 log 目录下一个名为 log.out 的文件中
• layout 被定义为 %m%n,即打印出来的日志信息末尾加入换行