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>
相关推荐
曹牧13 小时前
Java:Assert.isTrue()
java·前端·数据库
梦里小白龙14 小时前
JAVA 策略模式+工厂模式
java·开发语言·策略模式
你不是我我14 小时前
【Java 开发日记】我们来说一说 Redis 主从复制的原理及作用
java·redis·github
程序员葫芦娃14 小时前
【Java毕设项目】基于SSM的旅游资源网站
java·开发语言·数据库·编程·课程设计·旅游·毕设
Pocker_Spades_A14 小时前
飞算Java在线学生成绩综合统计分析系统的设计与实现
java·开发语言·java开发·飞算javaai炫技赛
肉丸滚球14 小时前
飞算 JavaAI 转 SpringBoot 项目沉浸式体验:高效开发在线图书借阅平台
java·spring boot·后端
叫我阿柒啊14 小时前
从Java全栈到前端框架:一场真实的技术面试对话
java·vue.js·spring boot·微服务·typescript·前端开发·后端开发
鸽鸽程序猿14 小时前
【JavaSE】简单理解JVM
java·jvm
Francek Chen14 小时前
【飞算JavaAI】智能开发助手赋能Java领域,飞算JavaAI全方位解析
java·开发语言·人工智能·ai编程·飞算
以己之14 小时前
初识测试(详细篇)
单元测试·压力测试·测试