当前位置: 首页 > 教程 > Log4j >

Log4j PattrernLayout格式

精华
小牛编辑
103浏览
2023-03-14

Log4j 提供 org.apache.log4j.PattrernLayout 类以基于模式的特定格式生成日志信息。

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

PatternLayout 也是一个简单的Layout对象,它提供了 Bean 属性即conversionPattern,可以使用配置文件进行设置:

ConversionPattern:该属性用于设置转换模式。默认为 %r [%t] %p %c %x - %m%n

PattrernLayout 模式转换字符

让我们看看下表描述了转换模式中使用的字符以及我们可以在自定义模式中使用的所有其他字符:

转换字符 描述
c 用于输出日志事件的类别。例如:对于类别名称 xyz,模式 %c{2} 将输出 yz
C 它用于输出发出日志请求的调用者的完全限定类名。例如,对于类名“org.apache.abc.MyClass”,模式 %C{1} 将输出“MyClass”。
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 中的信息。
% 字面百分号。%% 将打印一个 % 符号。

PattrernLayout 格式修饰符

默认情况下,相关信息显示为正常输出。但是,Log4j 提供了格式修饰符;借助此功能,可以更改最大字段宽度、最小字段宽度和对齐方式。

让我们看看一些修饰符:

格式修饰符 左对齐 最小宽度 最大宽度 描述
%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 个字符,则从头开始截断。

PattrernLayout 模式布局示例

让我们看一个 Patternlayout 的简单例子。

以下是 PatternLayout 的一个简单配置文件:

 log4j.properties:

# Define the root logger with appender file
log = d:/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

Log4jExample测试类

package cn.xnip;

import org.apache.log4j.Logger;

import java.io.IOException;
import java.sql.SQLException;

public class Log4jExample {
   /* Get actual name of the class 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");  
   }  
}  

当你编译并运行上述程序时,你会在 d:/log4j 目录下得到一个 log.out 文件,其中包含以下日志信息:

2021-09-10-main--DEBUG-cn.xnip.Log4jExample:Hello this is an debug message
2021-09-10-main--INFO -cn.xnip.Log4jExample:Hello this is an info message