log4j - 面试问题



尊敬的读者,这些log4j 面试问题专为帮助您熟悉在log4j主题面试中可能遇到的问题类型而设计。根据我的经验,优秀的 interviewers 很少会在面试前计划具体问题,通常会从该主题的一些基本概念开始提问,然后根据后续的讨论和您的回答继续提问。

log4j 是一个可靠、快速且灵活的 Java 编写的日志框架(API),根据 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 架构的布局层提供用于以不同样式格式化日志信息的 objects。它在发布日志信息之前为附加器对象提供支持。

Layout 对象在以人类可读且可重用的方式发布日志信息方面发挥着重要作用。

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 - 根据附加器,target 可以是控制台、文件或其他项目。

level - level 用于控制日志消息的过滤。

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

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

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

# Define the root logger with appender file
log = /usr/home/log4j
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

任何其他命名的 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。

以下语法定义了关闭 DEBUG 模式并启用 WARN 模式的根日志记录器。

# 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} 将打印存储在 MDC 中针对键 clientIP 的信息。

% − 字面百分号。%% 将打印一个 % 符号。

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

%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 Log Messages。

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

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

threshold − 此附加程序的阈值级别。

Filename − 日志文件的名称。

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

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

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

以下代码将 immediate flush 配置为 true:

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

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

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

以下代码将追加设置为 false,覆盖:

# Set the append to false, overwrite
log4j.appender.FILE.Append=false

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

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

默认值为 10 MB。

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

默认值为 1。

以下代码配置了 RollingFileAppender:

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.RollingFileAppender

以下代码配置了滚动前最大文件大小:

# Set the maximum file size before rollover
log4j.appender.FILE.MaxFileSize=5KB

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

# Set the the backup index
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:

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE 
# Define the file appender
log4j.appender.FILE = org.apache.log4j.DailyRollingFileAppender

以下代码配置了 DatePattern:

# Set the 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。

user − 设置数据库用户名。

下一步是什么?

接下来,您可以回顾一下您之前完成的与该主题相关的作业,并确保您能够自信地谈论它们。如果您是应届毕业生,面试官不会期望您能回答非常复杂的问题,而是需要您将基础概念掌握牢固。

其次,如果您无法回答几个问题,其实关系不大,重要的是,无论您回答了什么,都必须充满自信地回答。所以在面试过程中要保持自信。Tutorialspoint 祝您面试顺利,并祝您未来的事业一切顺利。干杯 :-)

广告