log4j2.xml介绍和使用

log4j2.xml是什么

log4j2.xml 是用于配置 Apache Log4j 2 的 XML 格式配置文件。Log4j 2 是一个用于 Java 应用的流行日志框架,提供灵活的日志管理和配置。在 log4j2.xml 文件中,可以配置日志记录的格式、级别、目的地等。

下面是一些主要节点和属性的详细说明:

  1. Configuration(配置):
  • 根节点,所有其他节点都位于此节点下。
  • 可以包含属性如 status(设置log4j框架本身的日志级别,如 TRACE、DEBUG)、monitorInterval(配置文件的热加载时间间隔,单位为秒)。
  1. Appenders(附加器):
  • 定义日志的输出目的地,比如文件、控制台、数据库等。
  • 常见的Appender有:Console(控制台)、File(文件)、RollingFile(滚动文件)、Socket(网络套接字)、JDBC(数据库)等。
  1. Loggers(记录器):
  • 定义日志记录的策略。
  • 根记录器(Root Logger):应用中所有日志的父记录器,可以定义全局日志级别和Appender。
  • 自定义记录器:可以为不同的类或包定义不同的日志级别和Appender。
  1. Properties(属性):
  • 用于定义全局属性,这些属性可以在配置文件中的其他地方引用。
  1. Filters(过滤器):
  • 控制哪些日志消息将被记录或丢弃。
  • 可以应用于 Configuration、Appender、Logger 级别。
  1. Layouts(布局):
  • 定义日志消息的格式。
  • 常见的Layout有:PatternLayout(允许自定义消息格式)、HtmlLayout(生成HTML格式的日志)、JsonLayout(生成JSON格式的日志)等。
  1. AppenderRefs(Appender引用):
  • 在 Loggers 节点下,通过 AppenderRef 节点引用一个或多个 Appenders,定义哪些 Appender 应该被用来记录日志。
  1. Logger(记录器):
  • name:定义Logger的名称,通常是相关联的Java类或包的名称。
  • level:定义日志级别,如 TRACE、DEBUG、INFO、WARN、ERROR、FATAL。
  • additivity:布尔值,控制日志是否向上级Logger传递,默认为true。

Appenders 节点详解

  • Console:用于定义输出日志到控制台的配置。可以通过 target 属性选择输出到标准输出(SYSTEM_OUT)或错误输出(SYSTEM_ERR),通常我们使用默认的 SYSTEM_OUT。PatternLayout 用于设置日志的输出格式,默认为 %m%n。
  • File:这个节点让我们能将日志直接输出到指定的文件中。我们需要设置 fileName 属性来指明日志文件的保存位置和文件名。同样,PatternLayout 允许我们自定义日志的格式。
  • RollingFile:相较于 File,RollingFile 添加了日志文件滚动的功能,即当日志文件达到一定条件时,自动创建新文件继续记录日志,避免单一文件过大。我们通过 filePattern 来设置新日志文件的命名规则。Policies 下的子节点如 TimeBasedTriggeringPolicy 和 SizeBasedTriggeringPolicy 分别根据时间和文件大小来触发滚动。DefaultRolloverStrategy 用于控制同一目录下最多保留的日志文件数量。
  • ThresholdFilter:这是一个可选属性,用来基于日志级别过滤日志记录。onMatch 和 onMismatch 属性允许我们精细控制日志的接受或拒绝规则。

Loggers 节点详解

  • Root:定义全局的日志记录策略,即如果没有为特定的类或包指定 Logger,就会默认使用 Root 的配置。level 属性确定了全局的日志级别。
  • Logger:用于为特定的类或包定义日志记录策略,可以单独设置日志级别和输出目的地(Appender)。name 属性指定了该 Logger 应用于哪个类或包,而 AppenderRef 子节点则指定了日志应该输出到哪个 Appender。如果希望日志仅输出到指定的 Appender 而不是同时输出到 Root 定义的 Appender,可以将 additivity 设置为 false。

SpringBoot项目中使用

pom.xml引入需要的依赖

<properties>
  <!-- spring-boot 版本 -->
  <spring-boot.version>2.2.5.RELEASE</spring-boot.version>
  <!-- log4j2 版本 -->
  <log4j.version>2.17.0</log4j.version>
</properties>


<!--web依赖        -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <version>${spring-boot.version}</version>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-log4j2</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-slf4j-impl</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>${log4j.version}</version>
</dependency>

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>${log4j.version}</version>
</dependency>

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j-impl</artifactId>
  <version>${log4j.version}</version>
</dependency>

配置文件 log4j2.xml

log4j2.xml 文件放在resources目录下

img

log4j2.xml 文件配置如下

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
  <properties>
    <property name="LOG_HOME">./logs</property>
  </properties>
  <Appenders>
    <!--*********************控制台日志***********************-->
    <Console name="consoleAppender" target="SYSTEM_OUT">
      <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
      <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
      <!--设置日志格式及颜色-->
      <PatternLayout
        pattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{}}{bright,yellow}: %msg%n%style{%throwable}{red}"
        disableAnsi="false" noConsoleNoAnsi="false" charset="UTF-8"/>
    </Console>

    <!--*********************文件日志***********************-->
    <!--all级别日志-->
    <RollingFile name="allFileAppender"
      fileName="${LOG_HOME}/all.log"
      filePattern="${LOG_HOME}/$${date:yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log">
      <!--设置日志格式-->
      <PatternLayout>
        <pattern>%d %p %C{} [%t] %m%n</pattern>
      </PatternLayout>
      <Policies>
        <!-- 设置日志文件切分参数 -->
        <!--<OnStartupTriggeringPolicy/>-->
        <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
        <SizeBasedTriggeringPolicy size="100MB"/>
        <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
        <TimeBasedTriggeringPolicy/>
      </Policies>
      <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
      <DefaultRolloverStrategy max="20"/>
    </RollingFile>

    <!--debug级别日志-->
    <RollingFile name="debugFileAppender"
      fileName="${LOG_HOME}/debug.log"
      filePattern="${LOG_HOME}/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log">
      <Filters>
        <!--过滤掉info及更高级别日志-->
        <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
      </Filters>
      <!--设置日志格式-->
      <PatternLayout>
        <pattern>%d %p %C{} [%t] %m%n</pattern>
      </PatternLayout>
      <Policies>
        <!-- 设置日志文件切分参数 -->
        <!--<OnStartupTriggeringPolicy/>-->
        <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
        <SizeBasedTriggeringPolicy size="100MB"/>
        <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
        <TimeBasedTriggeringPolicy/>
      </Policies>
      <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
      <DefaultRolloverStrategy max="20"/>
    </RollingFile>

    <!--info级别日志-->
    <RollingFile name="infoFileAppender"
      fileName="${LOG_HOME}/info.log"
      filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
      <Filters>
        <!--过滤掉warn及更高级别日志-->
        <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <!--设置日志格式-->
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- 设置日志文件切分参数 -->
                <!--<OnStartupTriggeringPolicy/>-->
                <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
                <SizeBasedTriggeringPolicy size="100MB"/>
                <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
            <!--<DefaultRolloverStrategy max="20"/>-->
        </RollingFile>

        <!--warn级别日志-->
        <RollingFile name="warnFileAppender"
                     fileName="${LOG_HOME}/warn.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <!--过滤掉error及更高级别日志-->
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <!--设置日志格式-->
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- 设置日志文件切分参数 -->
                <!--<OnStartupTriggeringPolicy/>-->
                <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
                <SizeBasedTriggeringPolicy size="100MB"/>
                <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>

        <!--error及更高级别日志-->
        <RollingFile name="errorFileAppender"
                     fileName="${LOG_HOME}/error.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
            <!--设置日志格式-->
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- 设置日志文件切分参数 -->
                <!--<OnStartupTriggeringPolicy/>-->
                <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
                <SizeBasedTriggeringPolicy size="100MB"/>
                <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>

        <!--json格式error级别日志-->
        <RollingFile name="errorJsonAppender"
                     fileName="${LOG_HOME}/error-json.log"
                     filePattern="${LOG_HOME}/error-json-%d{yyyy-MM-dd}-%i.log.gz">
            <JSONLayout compact="true" eventEol="true" locationInfo="true"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="100MB"/>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <logger name="org.springframework" level="info"/>
        <logger name="org.mybatis" level="info"/>
        <logger name="org.apache" level="info"/>
        <!-- 根日志设置 -->
        <Root level="INFO">
            <AppenderRef ref="allFileAppender" level="all"/>
            <AppenderRef ref="consoleAppender" level="debug"/>
            <AppenderRef ref="debugFileAppender" level="debug"/>
            <AppenderRef ref="infoFileAppender" level="info"/>
            <AppenderRef ref="warnFileAppender" level="warn"/>
            <AppenderRef ref="errorFileAppender" level="error"/>
            <AppenderRef ref="errorJsonAppender" level="error"/>
        </Root>
    </Loggers>

</Configuration>

重新运行后可以看到日志文件

img

控制台日志

img

  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值