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>
相关推荐
ChinaRainbowSea16 分钟前
1. 初始 RabbitMQ 消息队列
java·中间件·rabbitmq·java-rabbitmq
lmryBC4925 分钟前
golang接口-interface
java·前端·golang
ゞ 正在缓冲99%…26 分钟前
leetcode75.颜色分类
java·数据结构·算法·排序
橘猫云计算机设计38 分钟前
基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·考研·django·毕业设计
时光呢42 分钟前
JAVA常见的 JVM 参数及其典型默认值
java·开发语言·jvm
程序媛学姐1 小时前
SpringKafka错误处理:重试机制与死信队列
java·开发语言·spring·kafka
向阳2561 小时前
SpringBoot+vue前后端分离整合sa-token(无cookie登录态 & 详细的登录流程)
java·vue.js·spring boot·后端·sa-token·springboot·登录流程
XiaoLeisj1 小时前
【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法
xml·java·数据库·spring boot·sql·intellij-idea·mybatis
风象南1 小时前
SpringBoot实现数据库读写分离的3种方案
java·spring boot·后端
振鹏Dong2 小时前
策略模式——本质是通过Context类来作为中心控制单元,对不同的策略进行调度分配。
java·策略模式