log4j2-入门简介

1,846 阅读18分钟

log4j2简介

log4j是一个Java 日志框架, 旨在为应用程序提供记录日志的功能。 log4j大体可以分为2个版本: 1.x和2.x, 1.x已经不再维护,目前主流的应用版本是2.x, 2.x也被称为log4j2。

log4j2与其他日志框架的关系

slf4j

  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>

SLF4J是Java中各种日志框架的抽象, 比如java.util.Logging、logback、log4j等, 它允许在部署时插入所需的日志框架。

SLF4J通过加载org.slf4j.api.LoggerFactoryBinder的实现类org.slf4j.impl.StaticLoggerBinder来绑定真正的日志组件,具体的绑定方法在LoggerFactorybind方法里面。

SLF4J的使用方式为:

public class HelloWorld{
    private static final LoggerFactory LOGGER = LoggerFactory.getLogger(HelloWorld.class);
    
    public static void main(String[] args){
        LOGGER.info("this is info");
        LOGGER.debug("this is debug");
        // ...
    }
}

通过SLF4J提供的工厂类LoggerFactory获取日志对象Logger, 它们的API如下:

  • LoggerFactory
  • getLogger(Class<?> clazz): 最终通过调用下面的重载实现,name为clazz的getName返回值。
  • getLogger(String name):获取真正的绑定日志组件ILoggerFactory的实现子类, 调用它的getLogger(String name)获取日志对象。
  • Logger: Logger是一个接口, 提供了各种日志级别的方法定义,如:trace、debug、info、warn、error和getName, 如:
public String getName();
public void trace(String format, Object arg1, Object arg2);
public void debug(String format, Object arg);
public void info(String msg);
public void warn(Marker marker, String msg, Throwable t);
public void error(Marker marker, String msg, Throwable t);

log4j

log4j一般特指log4j 1.x, 是log4j 1.x多个版本的统称,目前已经停止维护。

log4j和log4j2的主要区别:

  • 配置文件类型
  • log4j通过一个.properties作为主配置文件。
  • log4j2主要采用.xml、.json或.jsn来完成配置。
  • 核心JAR包
  • log4j: log4j只需引入log4j:log4j一个jar包。
  • log4j2: log4j2需要引入org.apache.logging.log4j:log4j-coreorg.apache.logging.log4j:log4j-api2个jar包。
  • 文件渲染
  • log4j: log4j想要生效, 需要在web.xml中配置, 支持自由配置。
  • log4j2: 配置文件需要放在工程resources目录下,并且命名为log4j2.[xml/json]
  • Log调用
  • log4j: Logger logger = Logger.getLogger(name);
  • log4j2: Logger logger = LoggerManager.getLogger(name);

log4j2

log4j2是log4j 2.x版本的统称, 是目前log4j主流的版本, 相比log4j和logback, 根据官网描述,它具有以下优点:

  • 日志准确性: log4j2不会丢失事件(实际会存在丢失的情况)。
  • 性能提升: log4j2支持基于LMAX disruptor的异步Logger, 在多线程场景下, 性能优于log4j和logback10个数量级。
  • 产生垃圾少: log4j2在独立应用程序是无垃圾的, 在web应用程序中是低垃圾的,这可以减轻垃圾回收器的压力。
  • 插件化配置: 通过添加AppenderFiltersLayoutPatternsLookup扩展框架。
  • 自定义日志级别。
  • 支持Java8 Lambda表达式。
  • 支持SysLog
  • 并发支持并支持最低级别锁定, 避免死锁问题, 避免同步调用。

logback

logback作为log4j1.x的继承者,重构优化了log4j1.x存在的一些问题,logback分为3各模块:

  • logback-core: 基础模块。
  • logback-classic: log4j1.x的改进版本, 原生实现SLF4J。
  • logback-access:集成Tomcat和Jetty等容器, 提供Http访问日志功能。

Log4j2特点

Log4j2是目前Java世界中最好的日志组件, 相比其他日志组件使用更加广泛, 性能更加优异,参考官方Benchmarks

Log4j2入门

Log4j2核心架构

Log4j2核心架构如下:

image.png 使用时, 通过LogManager请求具有特定名称的Logger, LogManager会定位到具体的LoggerContext, 然后从中获取Logger。

public class Log4j2Use {
    private static final Logger logger = LogManager.getLogger();

    public static void main(String[] args) {
        logger.info("this is a log4j2 log");
    }
}

LoggerContext

LoggerContext是Logging系统的上下文, 一个应用程序可能会有多个LoggerContext,一搬来说独立应用程序只有一个。它主要维护了应用的Logger列表和Configuration配置。

Configuration

每个LoggerContext都有一个活动的Configuration。它包含了所有的Appenders、上下文范围的FilterLoggerConfigs,并包含大对StrSubstitutor的引用,其实就是对应Log4j2的配置文件。当重新配置时,将存在2个配置对象,直到所有Logger指向新的配置, 旧的配置将被停止并丢弃。

Logger

Logger是Log4j的核心接口, 并不执行任何直接操作, 它只是有一个名称和Appender相关联,它扩展了AbstractLogger并实现了真实调用的方法, 如果配置修改了, Logger也会关联不同的LoggerConfig对象, 最终导致行为被修改。

调用LoggerManager.getLogger方法, 相同的日志名称始终返回相同的Logger对象的应用, 比如:

Logger a = LoggerManager.getLogger("ab");
Logger b = LoggerManager.getLogger("ab");

Log4j采用软件名称来命名Logger, 通过在每个类中实例化一个Logger来完成,Logger的名称是类的完全限定类名, 这样可以很方便识别日志消息的来源, 但是Log4j不限定名称, 可以自定义实现。

Logger并不等同于配置文件中定义的Logger节点, 相反Logger中会维护一个PrivateConfig对象,它包含了ConfigurationLoggerConfig等引用。可以理解为此处的Logger是面向用户的日志入口, 可以存在多个, 多个Logger可以引用相同的LoggerConfig

LoggerConfig

LoggerConfig对应于配置文件中的Logger要素,LoggerConfig包含了一组FilterAppenderRef的引用,以及levelname、additivity

Filter

Filter用来定义过滤规则, 与防火墙的过滤规则类则类似, 每个过滤器返回的结果有3种类型:

  • Accept: 通过事件。
  • Deny: 拒绝事件
  • Neutral:传递给其他事件,如果没有其他事件, 则处理。

Appender

Appender意为附加器,即输出的目的地,Log4j支持控制台、文件、SocketFlumeJMSSyslog以及各种数据库。 发送给Logger的每个消息都将转发给此LoggerLoggerConfig中定义的所有Appender以及LoggerConfig父级LoggerConfigAppender

Layout

Layout用来定义输出的格式。

Log4j2日志级别

Log4j2支持以下日志级别:

  • ALL: 匹配所有级别事件。
  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • OFF: 不匹配任何事件。

Log4j2配置规范

配置方式

  • 配置文件方式:XMLJSONYAMLproperties 文件
  • 编程方式: 创建ConfigurationFactoryConfiguration的实现。
  • 编程方式: 通过调用Configuration中公开的API添加组件到默认配置中。
  • 编程方式: 通过调用内部Logger类的方法。

配置架构

Log4j2的配置反映为树形结构, 每个配置元素对应一个节点, 节点包含了一组属性,一组子节点和一个插件类型。实际上,每个节点必须有一个对应的插件, 因为插件是实际执行节点的工作组件。

Log4j2支持的每一种格式都有一个对应的ConfigurationFactoryFactory默认是一个插件, 它声明了支持的文件类型、优先级。 其中Properties Format优先级最高, 依次为YAMLJSONXML

Log4j2工作时,会执行每一个Factory, 以确定提供了哪种配置方式, 并创建相应的配置对象。

由于Propeties Format方式不是树结构, 相对其他几种文件格式配置文件较为冗余。

Log4j的配置对大小写不敏感。

自动配置

Log4j2具有在初始化期间自动化配置的能力, 如上节所说, 它启动时会找到所有的ConfiguationFactory插件, 并按优先级从高到低排序它们。它默认提供4种ConfigurationFacotry插件。

它的启动顺序如下:

  1. 检查系统属性:log4j2.configurationFile,尝试使用匹配文件扩展名的ConfigurationFactory来加载配置, 不限于本地位置,也可能包含URL.
  2. 如果没有设置该属性, 则按照优先级依次尝试在classpath上寻找以下文件加载配置:
    • log4j2-test.propeties
    • log4j2-test.yaml|log4j2-test.yml
    • log4j2-test.json|log4j2-test.jsn
    • log4j2-test.xml
    • log4j2.properties
    • log4j2.yaml|log4j2.yaml
    • log4j2.json|log4j2.jsn
    • og4j2.xml

3.如果找不到配置文件,则DefaultConfiguration则会启用, 这会导致日志输出到控制台。

DefaultConfiguration的配置如下:

  • 附加到ROOTConsoleAppender
  • PatternLayout的配置为: %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
  • ROOT的默认日志级别为ERROR
<?xml version="1.0" encoding="UTF-8"?>
  <Configuration status="WARN">
    <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="error">
        <AppenderRef ref="Console"/>   
      </Root>
    </Loggers>
 </Configuration>

从URL配置

URI加载过程

  1. 当系统属性log4j2.configurationFile引用了URI时, 先确认URL是否使用文件协议, 如果URL有效会继续处理。
  2. 如果使用文件协议以外的协议, 则会检查系统属性log4j2.Configuration.allowedProtocols是否包含指定的协议,如果包含则定位文件并继续处理。
  3. 如果不包含该协议, 则会抛出错误并记录。
  4. 如果log4j2.Configuration.allowedProtocols系统属性无设置值, 则默认采用Https协议。
  5. 如果将系统属性log4j2.Configuration.allowedProtocols设置为"_none", 则代表不支持文件协议之外的其他协议。

远程身份认证

Log4j支持需要远程身份认证的URI, 认证方式如下:

  1. 如果指定了log4j2.Configuration.usernamelog4j2.Configuration.password,则用于身份认证。
  2. 如果密码被加密, 可以在log4j2.Configuration.passwordDecryptor系统属性中自定义密码解密器的完全限定类名称。
  3. log4j2.Configuration.authenticationProvide系统属性设置AuthenticationProvider的自定义完全限定类名。

可加性(Additivity)

Additivity表示事件是否被父级记录器记录。如果为false表示会被父级记录器记录, 否则不会传递给父级记录器, 默认为true。 比如:

<Logger name="com.foo.Bar" level="TRACE"/>
<Root level="ERROR">
   <AppenderRef ref="STDOUT">
</Root>

com.foor.Bar的日志会被记录2此, 第一次被com.foor.Bar记录, 第二次被其父级记录器Root记录。 如果设置为false,则只会被com.foo.Bar记录一次, 如下:

<Logger name="com.foo.Bar" level="TRACE" additivity="false"/>
<Root level="ERROR">
   <AppenderRef ref="STDOUT">
</Root>

自动重新配置

从文件配置时, Log4j能自动检测对配置文件的修改并重新配置自身。如果配置了monitorInterval元素并且值不为零, 会定时检测并重新加载配置, 最小为5秒。如下:

 <?xml version="1.0" encoding="UTF-8"?>
 <Configuration monitorInterval="30">
  ...
 </Configuration>

配置语法

Configuration配置语法

Configuration主要包含了Loggers、Appenders、Filters3个子元素。

  • Configuration元素属性

    • monitorInterval:重新加载的间隔时间, 单位秒。
    • name: 配置名称。
    • advertiser: 广告上配置。
    • packages: 用于搜索插件的package名称逗号分隔列表。
    • shutdownTimeout: JVM关闭时超时时间, 单位毫秒, 默认零。
    • status: 记录Log4j内部事件的级别, 可以用来Debug。
    • strict:是否允许使用严格的XML格式。
    • schema: 标识类加载器的位置,以定位用于验证配置的 XML 模式。仅当 strict 设置为 true 时才有效。如果未设置,则不会进行架构验证。
  • Configuration子元素

    • Loggers: 记录器LoggerConfig配置。

    • Appenders: 附加器配置

    • Properties: 属性配置。

    • Filters/Filter: 过滤器配置。

    • CustomLevelsType/CustomLevelType: 自定义日志级别。

Configuration配置示例如下:

<?xml version="1.0" encoding="UTF-8" ?>

<Configuration xmlns="http://logging.apache.org/log4j/2.0/config" status="trace"  name="test-log4j2"
              strict="false" shutdownTimeout="30">
   <Properties>
       <Property name="test.key">good</Property>
       <Property name="jdk.version">1.8</Property>
   </Properties>
   <Filter type="ThresholdFilter" level="info" onMatch="ACCEPT" onMismatch="Neutral"/>
   
   <Appenders>
       <Console name="console" target="SYSTEM_OUT">
           <PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
       </Console>
   </Appenders>
   <Loggers>
       <Root level="info">
           <AppenderRef ref="console"/>
       </Root>
   </Loggers>
</Configuration>

Loggers配置语法

Loggers包含了Root和Logger2种子元素, 其中Root是一种特殊的的Logger, 用来定义Root记录器, Root默认会输出至控制台, 日志级别默认是ERROR; Logger可以定义多个。

  • Loggers子元素
    • Root: 子元素,Root记录器,是默认记录器,所有Logger的父级记录器。
    • Logger: 子元素,记录器。
  • Root元素:Root记录器不能设置Filter, 它是所有其他记录器的父级记录器。
    • level: 日志级别。
    • AppenderRef: 关联的附加器, 可以关联多个。
  • Logger元素: 用户自定义记录器。
    • name: 属性, Logger名称。
    • level: 属性, 日志级别。
    • additivity:属性, 可加性配置。
    • AppendRef: 子元素,关联的附加器, 可以关联多个。
    • Filter/Filters:子元素, 过滤器配置。
    示例如下:
<?xml version="1.0" encoding="UTF-8" ?>

<Configuration  status="error" name="test-log4j2" shutdownTimeout="30">
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
        </Console>

        <File name="org.good" filename="info.log">
            <Filters>
                <ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </File>

    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="console"/>
            <AppenderRef ref="org.good"/>
        </Root>
        <Logger name="org.good" level="info" additivity="false">
            <AppenderRef ref="org.good"/>
            <AppenderRef ref="console"/>
            <Filters>
                <ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </Logger>
    </Loggers>
Async Logger

AsyncLogger是异步记录器, 配置和Logger基本一致, 如下:

  • name: 属性, Logger名称。
  • level: 属性, 日志级别。
  • additivity:属性, 可加性配置。
  • AppendRef: 子元素,关联的附加器, 可以关联多个。
  • Filter/Filters:子元素, 过滤器配置。

示例如下:

<AsyncLogger name="org.good" level="info" additivity="false">
  <AppenderRef ref="org.good"/>
  <AppenderRef ref="console"/>
  <Filters>
      <ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
  </Filters>
</AsyncLogger>

Appenders配置语法

Appenders附加器主要包含2个子节点, 分别是Console和Appender, Console代表输出到控制台, Appender代表输出至其他地方, Appender的实现有很多种, 配置方式因具体的实现而异。

下面列举几种常用的Appender配置方式:

Console Appender

ConsoleAppender输出到控制台。

  • name: 属性, Console的名称。
  • target: 属性, 输出目的地, 2种选择:SYSTEM_OUT或者SYSTEM_ERR, 默认SYSTEM_OUT
  • Filter: 子元素, 过滤器。
  • Layout: 子元素, 布局, 输出格式。
    • pattern: 属性, 输出格式。

示例如下:

<Console name="console" target="SYSTEM_OUT">
    <PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
    <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
</Console>
File Appender

FileAppender是一个写入文件的附加器, 它写入filename属性声明的文件中。

  • fileName: 属性, 输出的文件名。
  • append: 属性,是否追加记录, 默认true, 如果为false, 每次写入会清空文件。
  • name: 属性, Appender名称。
  • filter: 元素, 过滤器设置。
  • layout: 元素, 布局设置。 其他属性或元素见官方文档。示例如下:
<File name="org.good" filename="info.log" append="false" >
    <Filters>
        <ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
    </Filters>
    <PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
</File>
RollingFile Appender

RollingFileAppender是一个滚动写入文件的附加器, 它会写入filename属性声明的定义中,并按照TriggeringPolicy和RolloverPolicy滚动文件, 比如线上日志过大影响性能, 需要按时间或文件大小风格文件。

  • fileName: 属性, 输出的文件名。
  • append: 属性,是否追加记录, 默认true, 如果为false, 每次写入会清空文件。
  • name: 属性, Appender名称。
  • filter: 元素, 过滤器设置。
  • layout: 元素, 布局设置。
  • filePattern: 属性, 归档日志文件的文件命名格式。
  • policy: 元素, 用于确定是否发生滚动的策略。
  • strategy: 元素, 用于确定存档文件的名称和位置的策略。 其他属性或元素见官方文档。示例如下:
<RollingFile name="web" filename="web.log" append="false" filepattern="web.log.$${date:yyyy-MM-dd}.gz">
    <Filters>
        <ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
    </Filters>
    <PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
    <Policies>
        <OnStartupTriggeringPolicy/>
        <SizeBasedTriggeringPolicy size="20MB" />
    </Policies>
    <DefaultRolloverStrategy max="20"/>
</RollingFile>
RandonAccessFile Appender

RandomAccessFileAppender和FileAppender类似,它总是被缓冲, 采用随机文件,性能会有大幅提升。

  • fileName: 属性, 输出的文件名。
  • append: 属性,是否追加记录, 默认true, 如果为false, 每次写入会清空文件。
  • name: 属性, Appender名称。
  • filter: 元素, 过滤器设置。
  • layout: 元素, 布局设置。 其他属性或元素见官方文档。示例如下:
<RandomAccessFile name="random" filename="random.log" >
    <Filters>
        <ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
    </Filters>
    <PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
</RandomAccessFile>
Async Appender

AsyncAppender是一个异步记录器,它接收其他Appender的引用, 并使用一个线程单独写入, 它应该晚于引用的Appender配置。

  • AppenderRef: 元素,引用的Appender。
  • errorRef: 元素, 发生错误时引用的Appender。
  • blocking: 属性, 是否阻塞。
  • shutdownTimeout:属性, 停止时超时等待时间。
  • filter: 元素, 过滤器配置。
  • name: 属性, appender名称。 其他属性或元素见官方文档。示例如下:
<Async name="Async" blocking="false">
    <AppenderRef ref="org.good"/>
</Async>
Socket Appender

SocketAppender是通过Socket发送日志到远程服务器的Appender。

  • name: 属性, Appender名称。
  • host:属性, 远程服务器host。
  • port: 属性, 远程服务器端口。
  • protocol: 属性, 协议: TCP/UDP。
  • ssl: 元素, SSL配置。
  • filter: 元素, 过滤器配置。
  • layout: 元素, 布局配置。
  • connectTimeoutMillis: 属性, 连接超时时间。 其他属性或元素见官方文档。示例如下:
<Socket name="socket" host="127.0.0.1" port="8080" protocol="tcp">
    <Filters>
        <ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
    </Filters>
    <PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
</Socket>

其他Kafka配置见官方文档。

Filter配置语法

Filter用来过滤事件, 它有2个重要属性:

  • onMatch: 属性,事件匹配时的action。
  • onMismatch: 属性, 事件不匹配时的action。

如前文所述, action可以是以下3种类型:

  • Accept: 通过事件。
  • Deny: 拒绝事件
  • Neutral:传递给其他事件,如果没有其他事件, 则处理。

过滤器有很多种:

  • BurstFilter: 提供了一种机制来控制处理 LogEvent 的速率,方法是在达到最大限制后静默丢弃事件。

  • CompositeFilter: CompositeFilter 提供了一种指定多个过滤器的方法。它作为过滤器元素添加到配置中,并包含要评估的其他过滤器。filters 元素不接受任何参数。

  • DynamicThresholdFilter: 允许根据特定属性按日志级别进行过滤。

  • MapFilter:允许过滤 MapMessage 中的数据元素。

  • MarkerFilter: 将配置的 Marker 值与 LogEvent 中包含的 Marker 进行比较。当标记名称与日志事件的标记或其父项之一匹配时,就会发生匹配。

  • NoMarkerFilter: 检查 LogEvent 中是否包含任何标记。当日志事件中没有标记时发生匹配。

  • RegexFilter: 允许将格式化或未格式化的消息与正则表达式进行比较。

  • Script: 执行返回 true 或 false 的脚本。

  • StructuredDataFilter: 是一个 MapFilter,它还允许过滤事件 id、类型和消息。

  • ThresholdFilter: 如果 LogEvent 中的级别与配置的级别相同或更具体,则此过滤器返回 onMatch 结果,否则返回 onMismatch 值

  • TimeFilter: 时间过滤器可用于将过滤器限制在一天中的某个时间段。

ThresholdFilter

其中ThresholdFilter时比较常见的过滤器, 可以根据日志级别进行匹配过滤, 它的配置方式为:

  • level: 属性, 日志级别
  • onMatch: 属性,事件匹配时的action。
  • onMismatch: 属性, 事件不匹配时的action。

示例如下:

<Filters>
   <ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>

Layout配置语法

Appender使用Layout将日志事件格式化为满足日志消费需求的格式。Log4j1.x和Logback的布局将日志事件转换为字符串, Log4j2.x布局返回一个字节数组。

Layout支持以下几种类型:

  • CSV Layout: 生成CSV格式的日志。
  • GELF Layout: 生成满足GrayLog格式的日志。
  • HTML Layout: 生成HTML页面。
  • JSON Layout: 生成JSON格式的日志。
  • JSON Template Layout: 高效、可定制、无垃圾的JSON模板布局。
  • Pattern Layout: 格式化字符串的布局。
  • XML Layout: XML格式的布局。
  • YAML Layout: YAML格式的布局。
  • SysLog Layout: 支持Syslog规范的布局。
Pattern Layout

Pattern Layout是最常用的布局方式, 类似于C中的Printf, 将日志消息转换为特定的字符串格式。

转换模式文字文本转换说明符组成。

  • 任何文字文本(包括特殊字符)都可能包含在转换模式中。特殊字符包括\n、\r、\t 等, 使用\在输出中插入一个反斜杠。*
  • 转换说明符由格式控制表达式组成, 类似C和Java中的字符串转换。
转换符

转换符以%开头, 后面跟可选的格式修饰符和转换字符。

  • 格式修饰符: 控制字段宽度、填充、左右对齐等内容。
  • 转换字符: 数据类型,比如类别、日期、线程名称、优先级等等。 比如: **"%-5p [%t]: %m%n"**转换模式的输出为:
DEBUG [main]: Message 1
  • 转换字符
    • %c{precision}: 输出记录器名称。

    • %C{precision}: 输出调用者的全限定类名。

    • %d{pattern}: 输出日志记录时间, pattern是时间格式。

    • %[enc|encode]{pattern}{[HTML|XML|JSON|CRLF]}: 以特定语言标记编码和转义特殊字符, 默认HTML。 比如用JSON编码: {message: "%enc{%m}{JSON}"}, 特殊字符就会转换为JSON支持的格式, 如\r转换为\\r。

    • %equals{pattern}{test}{substitution}: 用substitution替换pattern中匹配的test。

    • %equalsIgnoreCase{pattern}{test}{substitution}: 用substitution替换pattern中匹配的test。

    • %[ex|exception|throwable]{[none|full|...|n]}: 输出绑定到日志事件的异常堆栈, none、full等关键词用来定义输出的堆栈格式, 比如%ex{0}, 不输出异常堆栈。

    • %highlight{pattern}{style}: 输出日志的颜色。

    • %[m|msg|message]{ansi}: 输出与日志事件关联的应用程序提供的信息。

    • %[K|map|MAP]{key}: 输出MapMessage中的key, 如果key未指定,全部输出。

    • %[I|locaion]: 输出生成日志的位置信息。

    • %[L|line]: 输出代码行号。

    • %[M|method]: 输出日志的方法名称。

    • %[maxLen|maxLength]{pattern}{length}: 输出日志的最大长度, 如果超过会阶段, 如果长度大于20, 结尾会包含一个省略号。

    • %n{separator}: 指定日志的行分隔符。

    • %[N|nano]: 输出日志的创建时间。

    • %[pid|processId]{[defaultValue]}: 输出进程ID, 如果平台不支持,使用默认值。

    • %[p|level]{level=lable,level=lable}: 输出日志的级别, level是日志的级别, lable是应该显示的值。

    • %[p|level]{length=n}, 输出日志的级别, 取日志级别名称的的前n位, 如果n大于日志级别名称的长度, 则取正常日志级别名称。 可以组合以上两种, 如%level{ERROR=error, length=2}, 则ERROR级别的日志输出为error, 其他日志级别则输出前2位。

    • %[p|level]{lowerCase=true}: 输出日志级别名称的大小写。

    • %{r|relative}: 输出JVM启动以来的毫秒数。

    • %{T|tid|threadId}: 输出线程ID。

    • %{t|tn|thread|threadName}: 输出线程名称。

    • %{tp|threadPriority}: 输出线程的优先级。

    • %fqcn: 输出记录器的完全限定类名。

    • %R|repeat{string}{length}: 输出指定字符串的重复n次结果。

    • %replace{pattern}{regex}{substitution}: 用substitution替换模式中匹配的正则regex。

    • %notEmpty{pattern}: 输出不为空的日志。

    • %r[Ex|Exception|Throwable]: 和%throwable差不多, 但是堆栈跟踪从引发的第一个异常出发。

    • %sn: 输出递增的序列号。

    • %style{pattern}{ANSI style}: 设置模式的样式, 和%highlight类似。

    • %[u|uuid]{"RANOM"|"TIME"}: 输出UUID。

    • %[x|NDC]: 输出线程上下文堆栈。

    • %[X|mdc|MDC]{key}: 输出上下文线程堆栈中的key对应的值, 和%K用法类似。

    • %[xEx|xException|xThrowable]: 和%ex差不多, 但是会输出package信息和jar包信息。

  • 格式修饰符: 格式修饰符放在%和转换字符之间, 用来修饰输出的字段宽度、对齐方式等, 格式为%{justification flag}{min width}.{justification flag}{max width}{pattern}.
    • justification flag : 对齐方式, 默认右对齐,左对齐使用负号-。
    • min width: 最小宽度,小于最小宽度,进行填充。
    • max width: 最大宽度, 大于最大宽度,进行截断。
  %-30c: 左对齐,最小宽度30,无最大宽度。
  %30c: 右对齐,最小宽度30,无最大宽度。
  %.30c: 最大宽度30, 如果超过则从头开始截断。
  %20.30c: 右对齐,最小宽度20, 最大宽度30.
  %-20.-30c: 左对齐,最小宽度20, 最大宽度30

Log4j2实践

Maven依赖

<dependencies>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.2</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.2</version>
  </dependency>
</dependencies>

SLF4J绑定

<dependencies>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.17.2</version>
  </dependency>
</dependencies>

异步日志依赖

<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.4.2</version>
</dependency>

配置文件示例