log4j - PatternLayout
如果您想根据模式以特定格式生成日志信息,则可以使用 org.apache.log4j.PatternLayout 来格式化日志信息。
PatternLayout 类扩展了抽象 org.apache.log4j.Layout 类并覆盖 format() 方法以根据提供的模式构造日志信息。
PatternLayout 也是一个简单的 Layout 对象,它提供以下 Bean Property,可以使用配置文件进行设置:
| Sr.No. | 属性 &描述 |
|---|---|
| 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 示例
以下是 PatternLayout 的简单配置文件:
# 使用附加文件定义根记录器
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=%d{yyyy-MM-dd}-%t-%x-%-5p-%-10c:%m%n
现在考虑以下将生成日志信息的 Java 示例:
import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class log4jExample{
/* 获取要打印的实际类名 */
static Logger log = Logger.getLogger(log4jExample.class.getName());
public static void main(String[] args)throws IOException,SQLException{
log.debug("Hello this is an debug message");
log.info("Hello this is an info message");
}
}
编译并运行上述程序。它会在 /usr/home/log4j 目录中创建一个 log.out 文件,其中包含以下日志信息:
2010-03-23-main--DEBUG-log4jExample:Hello this is an debug message 2010-03-23-main--INFO -log4jExample:Hello this is an info message
log4j_log_formatting.htm

