log4j2 配置入门介绍

配置

将日志请求插入到应用程序代码中需要进行大量的计划和工作。

观察表明,大约4%的代码专门用于日志记录。因此,即使是中等规模的应用程序也会在其代码中嵌入数千条日志记录语句。

考虑到它们的数量,必须管理这些日志语句,而不需要手动修改它们。

Log4j 2的配置可以通过以下四种方式之一完成:

  • 通过用XML、JSON、YAML或属性格式编写的配置文件。

  • 通过编程方式,创建一个ConfigurationFactory和Configuration实现。

  • 通过编程方式,调用Configuration接口中公开的api,将组件添加到默认配置中。

  • 以编程方式,通过调用内部Logger类上的方法。

本页主要关注通过配置文件配置Log4j。关于以编程方式配置Log4j的信息可以在扩展Log4j 2和程序化Log4j配置中找到。

所有可用的格式在功能上都是相同的。

例如,可以使用属性格式重写XML中的配置文件(反之亦然),而不会损失任何功能。

但是,使用自然支持嵌套的格式可以更好地捕获Log4j配置的层次结构特性,因此XML、JSON和YAML文件通常更易于使用。

注意,这与Log4j 1不同。因此,公共Log4j 2 API不公开添加、修改或删除追加程序和过滤器的方法,也不公开以任何方式操纵配置的方法。

使用XML配置

Log4j可以使用两种XML样式进行配置;简洁严谨。

简洁的语法

简洁的格式使得配置非常容易,因为元素名称与其所代表的组件相匹配,但是不能用XML模式进行验证。

例如,通过在其父appenders元素下声明一个名为Console的XML元素来配置ConsoleAppender。但是,元素和属性名不区分大小写。

此外,属性既可以指定为XML属性,也可以指定为没有属性但有文本值的XML元素。所以

xml 复制代码
<PatternLayout pattern="%m%n"/>

xml 复制代码
<PatternLayout>
  <Pattern>%m%n</Pattern>
</PatternLayout>

是等价的。

下面的文件表示XML配置的结构,但请注意,下面斜体中的元素表示将出现在其位置上的简洁元素名称。

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>;
<Configuration>
  <Properties>
    <Property name="name1">value</property>
    <Property name="name2" value="value2"/>
  </Properties>
  <filter  ... />
  <Appenders>
    <appender ... >
      <filter  ... />
    </appender>
    ...
  </Appenders>
  <Loggers>
    <Logger name="name1">
      <filter  ... />
    </Logger>
    ...
    <Root level="level">
      <AppenderRef ref="name"/>
    </Root>
  </Loggers>
</Configuration>

请参阅本页中的许多示例,以了解附加程序、过滤器和日志记录器声明的示例。

严格的XML

除了上面简明的XML格式之外,Log4j还允许以一种更"正常"的XML方式指定配置,这种方式可以使用XML Schema进行验证。

这是通过用对象类型替换上面友好的元素名称来实现的,如下所示。

例如,不是使用名为Console的元素配置ConsoleAppender,而是将其配置为带有type属性"Console"的appender元素。

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>;
<Configuration>
  <Properties>
    <Property name="name1">value</property>
    <Property name="name2" value="value2"/>
  </Properties>
  <Filter type="type" ... />
  <Appenders>
    <Appender type="type" name="name">
      <Filter type="type" ... />
    </Appender>
    ...
  </Appenders>
  <Loggers>
    <Logger name="name1">
      <Filter type="type" ... />
    </Logger>
    ...
    <Root level="level">
      <AppenderRef ref="name"/>
    </Root>
  </Loggers>
</Configuration>

下面是使用严格格式的样例配置。

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" strict="true" name="XMLConfigTest"
               packages="org.apache.logging.log4j.test">
  <Properties>
    <Property name="filename">target/test.log</Property>
  </Properties>
  <Filter type="ThresholdFilter" level="trace"/>
 
  <Appenders>
    <Appender type="Console" name="STDOUT">
      <Layout type="PatternLayout" pattern="%m MDC%X%n"/>
      <Filters>
        <Filter type="MarkerFilter" marker="FLOW" onMatch="DENY" onMismatch="NEUTRAL"/>
        <Filter type="MarkerFilter" marker="EXCEPTION" onMatch="DENY" onMismatch="ACCEPT"/>
      </Filters>
    </Appender>
    <Appender type="Console" name="FLOW">
      <Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n"/><!-- class and line number -->
      <Filters>
        <Filter type="MarkerFilter" marker="FLOW" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
        <Filter type="MarkerFilter" marker="EXCEPTION" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
    </Appender>
    <Appender type="File" name="File" fileName="${filename}">
      <Layout type="PatternLayout">
        <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
      </Layout>
    </Appender>
  </Appenders>
 
  <Loggers>
    <Logger name="org.apache.logging.log4j.test1" level="debug" additivity="false">
      <Filter type="ThreadContextMapFilter">
        <KeyValuePair key="test" value="123"/>
      </Filter>
      <AppenderRef ref="STDOUT"/>
    </Logger>
 
    <Logger name="org.apache.logging.log4j.test2" level="debug" additivity="false">
      <AppenderRef ref="File"/>
    </Logger>
 
    <Root level="trace">
      <AppenderRef ref="STDOUT"/>
    </Root>
  </Loggers>
 
</Configuration>
相关推荐
消失的旧时光-194315 分钟前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解
NE_STOP24 分钟前
Redis--发布订阅命令和Redis事务
java
PAC_3Dame28 分钟前
记一次真实的线上OOM
java
SunnyDays10111 小时前
如何在Java中将Word文档转换为图像(JPEG、PNG或SVG)
java
Lumos_7771 小时前
Linux -- 线程
java·jvm·算法
知兀1 小时前
【MybatisPlus】后端用枚举类,数据库用tinyint,存在枚举类型转换
java
StockTV1 小时前
印度股票实时数据 NSE和BSE的实时行情、K 线及指数数据
java·开发语言·spring boot·python
User_芊芊君子1 小时前
【OpenAI 把 AI 玩明白了】:自主推理 + 动态知识图谱,这 4 个技术突破要颠覆行业
java·人工智能·知识图谱
c++之路2 小时前
C++20概述
java·开发语言·c++20
Championship.23.242 小时前
Linux Top 命令族深度解析与实战指南
java·linux·服务器·top·linux调试