log4j 面试问题(log4j Interview Questions)
亲爱的读者们,这些log4j Interview Questions专门设计用于让您熟悉在面试log4j时可能遇到的问题的本质。 根据我的经验,很好的面试官在你的面试中几乎不打算问任何特定的问题,通常问题从这个主题的一些基本概念开始,然后他们继续基于进一步的讨论和你回答的问题 -
log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它是在Apache软件许可下发布的。
log4j已移植到C,C ++,C#,Perl,Python,Ruby和Eiffel语言。
log4j可在运行时通过外部配置文件进行高度配置。 它根据优先级级别查看日志记录过程,并提供将日志记录信息导向各种目标的机制,例如数据库,文件,控制台,UNIX Syslog等。log4j有三个主要组件 -
记录器:负责捕获日志记录信息。
appenders:负责将日志信息发布到各个首选目的地。
布局:负责格式化不同样式的日志信息。
以下是log4j的功能 -
它是线程安全的。
它针对速度进行了优化。
它基于命名的记录器层次结构。
它支持每个记录器的多个输出appender。
它支持国际化。
它不限于预定义的一组设施。
可以使用配置文件在运行时设置日志记录行为。
它旨在从一开始就处理Java异常。
它使用多个级别,即ALL,TRACE,DEBUG,INFO,WARN,ERROR和FATAL。
通过扩展Layout类可以轻松更改日志输出的格式。
可以通过Appender接口的实现来更改日志输出的目标以及写入策略。
它是失败的。 但是,尽管它确实努力确保传递,但log4j并不保证每个日志语句都将传递到其目标。
以下是测井的优点和缺点 -
日志记录是软件开发的重要组成部分。 编写良好的日志记录代码提供快速调试,易于维护以及应用程序运行时信息的结构化存储。
记录也有其缺点。 它可以减慢应用程序的速度。 如果过于冗长,则会导致滚动失明。 为了缓解这些问题,log4j设计为可靠,快速和可扩展。
由于日志记录很少是应用程序的主要关注点,因此log4j API易于理解和使用。
Logger对象 - log4j体系结构的顶层是提供Logger对象的Logger。 Logger对象负责捕获日志记录信息,它们存储在命名空间层次结构中。
布局对象 - log4j体系结构的布局层提供了用于格式化不同样式的日志记录信息的对象。 它在发布日志记录信息之前为appender对象提供支持。
布局对象在以人类可读和可重用的方式发布日志记录信息方面发挥着重要作用。
Appender对象 - 这是一个较低级别的log4j体系结构,它提供了Appender对象。 Appender对象负责将日志记录信息发布到各种首选目标,例如数据库,文件,控制台,UNIX Syslog等。
Level Object - Level对象定义任何日志记录信息的粒度和优先级。 API中定义了七个级别的日志记录:OFF,DEBUG,INFO,ERROR,WARN,FATAL和ALL。
过滤器对象 - 过滤器对象用于分析日志记录信息,并进一步决定是否应记录该信息。 Appender对象可以有多个与之关联的Filter对象。 如果将日志记录信息传递给特定的Appender对象,则与该Appender关联的所有Filter对象都需要批准日志记录信息,然后才能将其发布到附加目标。
ObjectRenderer - ObjectRenderer对象专门提供传递给日志记录框架的不同对象的String表示。 Layout对象使用此对象来准备最终的日志记录信息。
LogManager - LogManager对象管理日志记录框架。 它负责从系统范围的配置文件或配置类中读取初始配置参数。
log4j.properties文件是一个log4j配置文件,它将属性保存在键值对中。 默认情况下,LogManager在CLASSPATH中查找名为log4j.properties的文件。
layout - Appender使用Layout对象和与它们关联的转换模式来格式化日志记录信息。
target - 目标可以是控制台,文件或其他项目,具体取决于appender。
level - 需要该级别来控制日志消息的过滤。
阈值 - Appender可以具有与其关联的阈值级别,而与记录器级别无关。 Appender忽略任何级别低于阈值级别的日志消息。
filter - Filter对象可以分析级别匹配之外的日志记录信息,并确定日志记录请求是由特定Appender处理还是忽略。
以下语法使用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
以下语法定义了文件appender的布局 -
# 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 - 指定对调试应用程序最有用的细粒度信息事件。
错误 - 指定可能仍允许应用程序继续运行的错误事件。
致命 - 指定非常严重的错误事件,可能会导致应用程序中止。
信息 - 指定信息性消息,突出显示粗粒度级别的应用程序进度。
关闭 - 最高排名,旨在关闭日志记录。
TRACE - 指定比DEBUG更精细的信息事件。
警告 - 指定可能有害的情况。
如果p> = q,则启用具有级别q的记录器中的级别p的日志请求。 这条规则是log4j的核心。 它假定级别是有序的。 对于标准级别,我们有ALL
以下语法定义了具有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 - 用于输出日志记录事件的类别。 例如,对于类别名称“abc”,模式%c {2}将输出“bc”。
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 Log Messages。
immediateFlush - 默认情况下,此标志设置为true,这意味着每次追加操作都会刷新文件的输出流。
encoding - 可以使用任何字符编码。 默认情况下,它是特定于平台的编码方案。
threshold - 此appender的阈值级别。
文件名 - 日志文件的名称。
fileAppend - 默认设置为true,这意味着日志信息将附加到同一文件的末尾。
bufferedIO - 此标志指示是否需要启用缓冲写入。 默认情况下,它设置为false。
bufferSize - 如果启用了缓冲I/O,则表示缓冲区大小。 默认情况下,它设置为8kb。
以下代码将立即刷新配置为true -
# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true
以下代码将阈值设置为调试模式 -
# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug
以下代码将append设置为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 - 设置数据库用户名。
接下来是什么 (What is Next?)
此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。