log4j - PatternLayout

  • 简述

    如果要基于模式以特定格式生成日志信息,则可以使用 org.apache.log4j.PatternLayout 格式化您的日志信息。
    PatternLayout 类扩展了抽象 org.apache.log4j.Layout 类并覆盖 format() 根据提供的模式构造日志信息的方法。
    PatternLayout 也是一个简单的 Layout 对象,它提供了以下 -可以使用配置文件设置的Bean 属性
    序号 属性和描述
    1 conversionPattern
    设置转换模式。默认为 %r [%t] %p %c %x - %m%n
  • 模式转换字符

    下表说明了上述模式中使用的字符以及您可以在自定义模式中使用的所有其他字符:
    转换字符 意义
    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 false 20 none 如果类别名称少于 20 个字符,则左填充空格。
    %-20c true 20 none 如果类别名称的长度少于 20 个字符,则在右侧填充空格。
    %.30c 不适用 none 30 如果类别名称超过 30 个字符,则从头开始截断。
    %20.30c false 20 30 如果类别名称少于 20 个字符,则左填充空格。但是,如果类别名称超过 30 个字符,则从头开始截断。
    %-20.30c true 20 30 如果类别名称短于 20 个字符,则在右侧填充空格。但是,如果类别名称超过 30 个字符,则从头开始截断。
  • 模式布局示例

    以下是 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");
       }
    }
    
    编译并运行上述程序。它将在 /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