log4j - 问题和答案

log4j 是一个可靠、快速且灵活的日志记录框架 (API),用 Java 编写,根据 Apache 软件许可分发。

log4j 已移植到 C、C++、C#、Perl、Python、Ruby 和 Eiffel 语言。

log4j 在运行时可通过外部配置文件进行高度配置。它从优先级的角度来查看日志记录过程,并提供将日志记录信息定向到各种目标(例如数据库、文件、控制台、UNIX Syslog 等)的机制。

log4j 有三个主要组件 −

  • loggers:负责捕获日志记录信息。

  • appenders:负责将日志记录信息发布到各种首选目标。

  • layouts:负责以不同的样式格式化日志记录信息。

以下是 log4j − 的功能

  • 它是线程安全的。

  • 它针对速度进行了优化。

  • 它基于命名的记录器层次结构。

  • 它支持每个记录器有多个输出附加器。

  • 它支持国际化。

  • 它不限于一组预定义的设施。

  • 可以使用配置文件在运行时设置日志记录行为。

  • 它从一开始就被设计为处理 Java 异常。

  • 它使用多个级别,即 ALL、TRACE、DEBUG、INFO、WARN、ERROR 和FATAL。

  • 通过扩展 Layout 类可以轻松更改日志输出的格式。

  • 可以通过 Appender 接口的实现更改日志输出的目标以及写入策略。

  • 它是故障停止的。但是,尽管它确实努力确保交付,但 log4j 并不保证每个日志语句都将传递到其目的地。

以下是日志记录的优点和缺点 −

日志记录是软件开发的重要组成部分。编写良好的日志代码可以快速调试、轻松维护,并结构化存储应用程序的运行时信息。

日志记录也有其缺点。它会减慢应用程序的速度。如果太冗长,可能会导致滚动失明。为了缓解这些问题,log4j 被设计为可靠、快速和可扩展的。

由于日志记录很少是应用程序的主要焦点,因此 log4j API 力求简单易懂和使用。

Logger 对象 − log4j 架构的顶层是 Logger,它提供 Logger 对象。Logger 对象负责捕获日志信息,这些信息存储在命名空间层次结构中。

Layout 对象 − log4j 架构的布局层提供用于以不同样式格式化日志信息的对象。它在发布日志信息之前为附加对象提供支持。

布局对象在以人性化和可重用的方式发布日志信息方面发挥着重要作用。

Appender 对象 − 这是 log4j 架构的较低层,提供 Appender 对象。Appender 对象负责将日志信息发布到各种首选目标,例如数据库、文件、控制台、UNIX Syslog 等。

Level 对象 - Level 对象定义任何日志信息的粒度和优先级。 API 中定义了七个级别的日志记录:OFF、DEBUG、INFO、ERROR、WARN、FATAL 和 ALL。

Filter 对象 − Filter 对象用于分析日志记录信息并进一步决定是否应记录该信息。 Appender 对象可以有多个与其关联的 Filter 对象。如果将日志记录信息传递给特定的 Appender 对象,则与该 Appender 关联的所有 Filter 对象都需要批准该日志记录信息,然后才能将其发布到附加的目标。

ObjectRenderer − ObjectRenderer 对象专门用于提供传递给日志框架的不同对象的字符串表示。Layout 对象使用此对象来准备最终的日志信息。

LogManager − LogManager 对象管理日志框架。它负责从系统范围的配置文件或配置类中读取初始配置参数。

log4j.properties 文件是一个 log4j 配置文件,它将属性保存在键值对中。默认情况下,LogManager 会在 CLASSPATH 中查找名为 log4j.properties 的文件。

layout − Appender 使用 Layout 对象及其关联的转换模式来格式化日志信息。

target − 目标可能是控制台、文件或其他项目,具体取决于附加器。

级别 − 级别是控制日志消息过滤所必需的。

阈值 − Appender 可以具有与其关联的阈值级别,与记录器级别无关。 Appender 会忽略任何级别低于阈值的日志消息。

filter − Filter 对象可以分析超出级别匹配的日志信息,并决定日志请求是否应由特定的 Appender 处理或忽略。

以下语法定义带有附加器文件的根记录器:

# 定义带有附加器文件的根记录器
log = /usr/home/log4j
log4j.rootLogger = DEBUG, FILE

以下语法定义文件附加器 −

# 定义文件附加器
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

以下语法定义文件附加器的布局 −

# 定义文件附加器的布局
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

任何其他命名的 Logger 对象实例都通过第二种方法通过传递记录器的名称来获取。记录器的名称可以是任何可以传递的字符串,通常是类或包名称,就像我们在上一章中使用过的一样,下面会提到 −

static Logger log = Logger.getLogger(log4jExample.class.getName());

Logger 类的 public void debug(Object message) 打印级别为 Level.DEBUG 的消息。

Logger 类的 public void error(Object message) 打印级别为 Level.ERROR 的消息。

Logger 类的 public void fatal(Object message) 打印级别为 Level.FATAL 的消息。

Logger 类的 public void info(Object message) 打印级别为 Level.INFO 的消息。

Logger 类的 public void warn(Object message) 打印级别为 Level.WARN 的消息。

Logger 类的 public void trace(Object message) 打印级别为 Level.TRACE 的消息。

ALL − 所有级别,包括自定义级别。

DEBUG − 指定对调试应用程序最有用的细粒度信息事件。

ERROR − 指定可能仍允许应用程序继续运行的错误事件。

FATAL −指定非常严重的错误事件,可能导致应用程序中止。

INFO − 指定以粗粒度突出显示应用程序进度的信息性消息。

OFF − 最高级别,用于关闭日志记录。

TRACE − 指定比 DEBUG 更细粒度的信息事件。

WARN −指定潜在的有害情况。

如果 p >= q,则启用级别 q 的记录器中级别 p 的日志请求。此规则是 log4j 的核心。它假定级别是有序的。对于标准级别,我们有 ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF。

以下语法定义了具有 WARN 模式的根记录器,关闭了 DEBUG 模式。

# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = WARN, FILE

如果您想根据模式以特定格式生成日志信息,则可以使用 org.apache.log4j.PatternLayout 来格式化日志信息。

PatternLayout 类扩展了抽象的 org.apache.log4j.Layout 类,并重写了 format() 方法,以根据提供的模式构造日志信息。

c − 用于输出日志事件的类别。例如,对于类别名称"a.b.c",模式 %c{2} 将输出"b.c"。

C − 用于输出发出日志记录请求的调用者的完全限定类名。例如,对于类名。 "org.apache.xyz.SomeClass",模式 %C{1} 将输出"SomeClass"。

d − 用于输出日志记录事件的日期。例如 %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}。

F − 用于输出发出日志记录请求的文件名。

l −用于输出生成日志记录事件的调用者的位置信息。

L − 用于输出发出日志记录请求的行号。

m − 用于输出与日志记录事件相关的应用程序提供的消息。

M −用于输出发出日志记录请求的方法名称。

n − 输出平台相关的行分隔符。

p − 用于输出日志记录事件的优先级。

r − 用于输出从布局构建到创建日志记录事件所经过的毫秒数。

t − 用于输出生成日志记录事件的线程的名称。

x −用于输出与生成日志事件的线程关联的 NDC(嵌套诊断上下文)。

X − X 转换字符后跟 MDC 的键。例如,X{clientIP} 将打印针对键 clientIP 存储在 MDC 中的信息。

% − 文字百分号。 %% 将打印 % 符号。

默认情况下,相关信息按原样显示。但是,借助格式修饰符,可以更改最小字段宽度、最大字段宽度和对齐方式。

%20c −如果类别名称长度少于 20 个字符,则在左侧用空格填充。

%-20c − 如果类别名称长度少于 20 个字符,则在右侧用空格填充。

%.30c −如果类别名称超过 30 个字符,则从开头截断。

%20.30c − 如果类别名称短于 20 个字符,则在左侧用空格填充。但是,如果类别名称超过 30 个字符,则从开头截断。

%-20.30c − 如果类别名称短于 20 个字符,则在右侧用空格填充。但是,如果类别名称超过 30 个字符,则从开头截断。

如果您想在 HTML 格式的文件中生成日志信息,那么您可以使用 org.apache.log4j.HTMLLayout 来格式化日志信息。

HTMLLayout 类扩展了抽象的 org.apache.log4j.Layout 类,并从其基类中覆盖 format() 方法以提供 HTML 样式的格式。

它提供以下要显示的信息 −

  • 从应用程序启动到生成特定日志事件所经过的时间。

  • 调用日志请求的线程的名称。

  • 与此日志请求关联的级别。

  • 记录器和日志消息的名称。

  • 程序文件的可选位置信息以及调用此日志的行号。

HTMLLayout.setContentType(String) − 设置 HTML 内容的内容类型。默认为 text/html。

HTMLLayout.setLocationInfo(String) − 设置日志记录事件的位置信息。默认为 false。

HTMLLayout.setTitle(String) − 设置 HTML 文件的标题。默认为 log4j 日志消息。

immediateFlush − 此标志默认设置为 true,这意味着每次附加操作都会刷新到文件的输出流。

encoding − 可以使用任何字符编码。默认情况下,它是特定于平台的编码方案。

阈值 −此附加器的阈值级别。

Filename − 日志文件的名称。

fileAppend − 默认设置为 true,这意味着将日志信息附加到同一文件的末尾。

bufferedIO − 此标志表示我们是否需要启用缓冲写入。默认情况下,它设置为 false。

bufferSize − 如果启用了缓冲 I/O,则表示缓冲区大小。默认情况下,它设置为 8kb。

以下代码将立即刷新配置为 true −

# 将立即刷新设置为 true(默认)
log4j.appender.FILE.ImmediateFlush=true

以下代码将阈值设置为调试模式 −

# 将阈值设置为调试模式
log4j.appender.FILE.Threshold=debug

以下代码将附加设置为 false,覆盖 −

# 将附加设置为 false,覆盖
log4j.appender.FILE.Append=false

要将日志信息写入多个文件,您必须使用 org.apache.log4j.RollingFileAppender 类,该类扩展了 FileAppender 类并继承了其所有属性。

这是文件的临界大小,超过该大小文件将被滚动。

默认值为 10 MB。

此属性表示要创建的备份文件的数量。

默认值为 1。

以下代码配置 RollingFileAppender −

# 使用附加器文件定义根记录器
log4j.rootLogger = DEBUG, FILE
# 定义文件附加器
log4j.appender.FILE=org.apache.log4j.RollingFileAppender

以下代码配置滚动前的最大文件大小 −

# 设置滚动前的最大文件大小
log4j.appender.FILE.MaxFileSize=5KB

以下代码配置要使用的最大文件数 −

# 设置备份索引
log4j.appender.FILE.MaxBackupIndex=2

将创建一个新的日志文件。

一旦最后一个日志文件达到最大大小,第一个日志文件将被删除,此后,所有日志信息将回滚到第一个日志文件。

要每天将日志信息写入文件,您必须使用 org.apache.log4j.DailyRollingFileAppender 类,该类扩展了 FileAppender 类并继承了其所有属性。

这表示何时滚动文件以及要遵循的命名约定。默认情况下,滚动在每天午夜执行。

'.' yyyy-MM −在每个月末和下个月初滚动。

'.' yyyy-MM-dd − 每天午夜滚动。这是默认值。

'.' yyyy-MM-dd-a −每天中午和午夜滚动。

'.' yyyy-MM-dd-HH − 每小时开始时滚动。

'.' yyyy-MM-dd-HH-mm − 每分钟滚动。

'.' yyyy-ww − 根据语言环境在每周的第一天滚动。

以下代码配置 DailyRollingFileAppender −

# 使用附加器文件定义根记录器
log4j.rootLogger = DEBUG, FILE
# 定义文件附加器
log4j.appender.FILE = org.apache.log4j.DailyRollingFileAppender

以下代码配置 DatePattern −

# 设置 DatePattern
log4j.appender.FILE.DatePattern = '.' yyyy-MM-dd-a

log4j API提供了org.apache.log4j.jdbc.JDBCAppender对象,该对象可以将日志信息放入指定的数据库中。

driver − 将驱动程序类设置为指定的字符串。如果没有指定驱动类,则默认为sun.jdbc.odbc.JdbcOdbcDriver。

password − 设置数据库密码。

sql − 指定每次发生日志记录事件时要执行的SQL语句。这可以是 INSERT、UPDATE 或 DELETE。

URL − 设置 JDBC URL。

用户 − 设置数据库用户名。