扫码一下
查看教程更方便
如果我们想基于模式以特定格式生成日志信息,那么可以使用 org.apache.logging.log4j.PatternLayout
来格式化我们的日志信息。
PatternLayout
类继承了抽象的 org.apache.logging.log4j.Layout
类并覆盖了 format()
方法,从而根据提供的模式构造日志信息。
PatternLayout
也是一个简单的 Layout 对象,它提供了以下 Bean
属性,可以使用配置文件进行设置:
序号 | 属性 | 描述 |
---|---|---|
1 | conversionPattern | 设置转换模式。 默认为 %r [%t] %p %c %x - %m%n |
下表说明了上述模式中使用的字符以及我们可以在自定义模式中使用的所有其他字符:
转换字符 | 描述 |
---|---|
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 | false | 20 | none | 如果类别名称的长度少于 20 个字符,则左填充空格。 |
%-20c | true | 20 | none | 如果类别名称的长度少于 20 个字符,请在右侧填充空格。 |
%.30c | NA | none | 30 | 如果类别名称超过 30 个字符,则从头开始截断。 |
%20.30c | false | 20 | 30 | 如果类别名称短于 20 个字符,则左填充空格。 但是,如果类别名称超过 30 个字符,则从头开始截断。 |
%-20.30c | true | 20 | 30 | 如果类别名称短于 20 个字符,则在右侧填充空格。 但是,如果类别名称超过 30 个字符,则从头开始截断。 |
以下是 PatternLayout 的简单配置文件:
property.filename = /workspace/java/log4j
#
appender.infoFile.type = FILE
appender.infoFile.name = infoLogFile
#
appender.infoFile.fileName=${filename}/log.out
appender.infoFile.layout.type = PatternLayout
appender.infoFile.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c{1} [%t] - %m%n
rootLogger.level = warn
rootLogger.appenderRef.infoFile.ref = infoLogFile
rootLogger.appenderRef.infoFile.level = warn
现在看以下将生成日志记录信息的 Java 示例:
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class log4jExample{
/* Get actual class name to be printed on */
static Logger logger = LogManager.getLogger(log4jExample.class.getName());
public static void main(String[] args)throws IOException,SQLException{
logger.trace("trace level");
logger.debug("debug level");
logger.info("info level");
logger.warn("warn level");
logger.error("error level");
logger.fatal("fatal level");
}
}
编译并运行上述程序。 它将在 /workspace/java/log4j 目录中创建一个 log.out 文件,其中包含以下日志信息: