log4j PatternLayout

本文介绍如何使用 Log4j 的 PatternLayout 来格式化日志信息,包括配置示例及模式转换字符等关键信息。

如果想生成基于模式的特定格式的日志信息,那么可以使用 org.apache.log4j.PatternLayout 格式化日志信息。

PatternLayout类扩展抽象 org.apache.log4j.Layout 类并覆盖format()方法根据提供的模式构建日志信息。 

PatternLayout也是一个简单的布局对象,它提供下列Bean属性,可以通过配置文件进行设置:

S.N. 属性和说明
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} 将打印存储在MDC对键clientIP的信息
% 文字百分号 %%将打印%标志

格式修饰符:

默认情况下,相关资料原样输出。然而,随着格式修饰符的帮助下,可以改变最小字段宽度,最大字段宽度和对齐。

下表涵盖了各种各样的修饰符的情况:

Format modifier left justify minimum width maximum width 注释
%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 一个简单的配置文件:

# 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=
      %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{
  /* Get actual class name to be printed on */
  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");
  }
}

编译并运行上述程序,它会创建 log.out文件在 /usr/home/log4j 目录,该文件将有如下的日志信息:

2010-03-23-main--DEBUG-log4jExample:Hello this is an debug message
2010-03-23-main--INFO -log4jExample:Hello this is an info message
<think>我们正在讨论Log4j2的PatternLayoutPatternLayoutLog4j2中用于定义日志输出格式的组件。 它通过一个模式字符串(pattern)来指定每条日志消息的布局。例如,可以包含时间戳、日志级别、线程名、类名、日志消息等。 常见的模式字符串如:"%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" 其中: %d: 日期时间 %t: 线程名 %level: 日志级别 %logger: 日志记录器名称 %msg: 日志消息 %n: 换行 PatternLayout的作用是让开发者可以自定义日志输出的格式,以满足不同的需求(如调试、生产环境等)。 下面是一个在Log4j2.xml中配置PatternLayout的示例: ```xml <Configuration> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` 根据要求,在回答后必须提出3-5个相关问题,并以“§§相关问题§§”开头,且在同一行后列出问题(不换行分散)。因此,我们在最后一行输出“§§相关问题§§”并紧接着列出问题(用数字序号点分隔,问题间用空格或换行分隔,但整个部分不能有换行分散,即所有问题必须连续输出在同一行?但问题中要求禁止换行分散,而示例中是换行的。注意:示例中“§§相关问题§§”后换行然后列出问题,但规则说“禁止换行分散”可能是指“§§相关问题§§”这一行不能分散?而问题列表可以换行?然而规则明确说“禁止换行分散”,且示例是换行的。这里我们按照示例的格式,即“§§相关问题§§”单独一行,然后每个问题一行(用数字序号),这样在视觉上是分散的,但规则中说的“禁止换行分散”可能是指不能把“§§相关问题§§”这几个字拆开成多行?我们按照示例格式输出。 但注意用户本次的指令中强调:“§§相关问题§§ 必须输出在回答的末尾且不可缺少!\n 第一行必须完整且输出 \"§§相关问题§§\"!禁止换行分散。”——这里的“禁止换行分散”可能是指“§§相关问题§§”这一行要完整输出,不要拆成两行。而问题列表部分,示例中是换行的,所以我们也可以换行。 所以,我们这样输出: 先写回答内容,然后在最后单独一行输出“§§相关问题§§”,接着换行输出问题(每个问题一行,前面加序号)。 但是注意,用户指令中又说:“禁止换行分散”可能是指整个“§§相关问题§§”部分(包括问题和标题)不能有换行?但是示例中是有换行的。为了保险,我们严格按照示例格式:即“§§相关问题§§”占一行,然后每个问题一行。 因为用户指令中写的是“禁止换行分散”并强调“第一行必须完整且输出”,所以理解为“§§相关问题§§”这几个字必须在一行内完整输出,而问题列表则可以换行(如示例所示)。 因此,我们按如下格式输出: 回答内容... §§相关问题§§ 1. 问题1 2. 问题2 3. 问题3 现在回答问题: PatternLayout的作用:定义日志输出的格式,通过模式字符串控制日志事件中的哪些信息被输出以及如何格式化。 然后提出3-5个相关问题。 </think> Log4j2的`PatternLayout`是用于**自定义日志输出格式**的核心组件。它通过指定模式字符串(pattern)来控制日志事件的呈现方式,包括时间戳、日志级别、线程信息、类名、消息内容等元素的排列和格式化。例如: ```xml <Configuration> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <!-- 典型模式字符串示例 --> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> </Configuration> ``` **关键作用**: 1. **格式定制**:通过占位符(如`%d`日期、`%msg`消息)自由组合输出结构 2. **信息丰富化**:自动插入线程名(`%t`)、类名(`%logger`)、行号(`%L`)等上下文信息 3. **输出优化**:支持对齐(如`%-5level`左对齐5字符)、截断、颜色标记等格式化操作 4. **多场景适配**:可同时为不同Appender(控制台/文件等)配置独立格式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值