java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot Log4j2入门

SpringBoot日志框架之Log4j2快速入门与参数详解

作者:莫念Program

本文介绍了SpringBoot日志框架log4j2的基本使用和配置方法,包括将日志输出到控制台、文件、Elasticsearch和Kafka,多个输出目的地的配置,异步日志记录器的使用以及log4j2.xml配置文件的详细语法和参数含义,需要的朋友可以参考下

Quick Start

在SpringBoot中使用log4j2日志框架,只需三步:

引入依赖

dependencies {
    implementation 'org.apache.logging.log4j:log4j-core:2.14.1'
    implementation 'org.apache.logging.log4j:log4j-api:2.14.1'
    implementation "org.apache.logging.log4j:log4j-slf4j-impl:2.14.1"
    implementation('org.springframework.boot:spring-boot-starter') {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

为了避免日志框架之间的冲突,建议在使用Log4j2时将其他的日志框架排除掉,例如在build.gradle文件中排除Spring Boot默认的Logback日志框架

配置log文件

创建Log4j2的配置文件log4j2.xml,可以放在src/main/resources目录下或指定的目录下。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

上面的配置文件定义了一个名为Console的Appender,用于将日志输出到控制台。它使用了PatternLayout来定义日志输出格式,包含了日期、线程、日志级别、Logger名称和消息等信息。在Loggers中,我们将根Logger的日志级别设置为info,并将Console Appender添加到根Lodagger中。

获取Logger实例并输出日志

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MyService {
    private static final Logger logger = LogManager.getLogger(MyService.class);
    public void doSomething() {
        logger.debug("Debug message");
        logger.info("Info message");
        logger.warn("Warning message");
        logger.error("Error message");
    }
}

使用LogManager获取Logger实例,然后使用Logger的debug、info、warn和error方法来记录不同级别的日志。

这是日志输出结果,机智的朋友可能已经发现了,这段输出里没有debug级别的日志,这是因为在默认情况下,Logback 只会输出 INFO 级别及以上的日志信息。

我们把日志级别从info改成debug就可以输出debug日志了

<Loggers>
  <Root level="debug">
    <AppenderRef ref="Console"/>
  </Root>
</Loggers>

@Slf4j注解

@Slf4j 是 Lombok 提供的一个注解,用于在编译时自动生成日志变量。

dependencies {
    implementation 'org.apache.logging.log4j:log4j-core:2.14.1'
    implementation 'org.apache.logging.log4j:log4j-api:2.14.1'
    implementation "org.apache.logging.log4j:log4j-slf4j-impl:2.14.1"
    implementation('org.springframework.boot:spring-boot-starter') {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

使用 @Slf4j 注解需要引入 lombok 和 SLF4J 的依赖。

import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MyClass {
    public void myMethod() {
        log.info("这是一条日志");
    }
}

@Slf4j 注解会自动生成一个名为 log 的日志变量,我们可以直接使用 log 对象来记录日志。

log4j2.xml 详解

log4j2.xml 是 log4j 2.x 版本的配置文件格式,用于配置日志记录器的行为。它可以定义多个日志记录器、日志输出器和日志格式。

标签简介

以下是一些 log4j2.xml 中的重要标签:

输出到控制台

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

该文件定义了一个名为 Console 的 Appender,用于将日志输出到控制台。

PatternLayout格式化字符串含义如下:

该文件还定义了一个 Root logger,将日志级别设置为 info,表示只输出 INFO 级别及以上的日志信息,并将它的 AppenderRef 设置为 Console。

输出到文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info">
    <Appenders>
        <RollingFile name="RollingFile" fileName="/path/to/logs/myapp.log"
                     filePattern="/path/to/logs/myapp-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="RollingFile"/>
        </Root>
    </Loggers>
</Configuration>

这个配置文件中定义了一个名为 RollingFile 的 Appender,用于将日志输出到文件。

RollingFile Appender 使用了 TimeBasedTriggeringPolicy 和 SizeBasedTriggeringPolicy,表示按时间和文件大小来滚动文件,以避免日志文件过大。DefaultRolloverStrategy 表示最多保留 10 个日志文件。

输出到多个文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info">
    <Appenders>
        <Routing name="Routing">
            <Routes pattern="$${ctx:logFileName}">
                <Route>
                    <File name="file" fileName="/path/to/logs/${ctx:logFileName}.log">
                        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
                    </File>
                </Route>
            </Routes>
        </Routing>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Routing"/>
        </Root>
    </Loggers>
</Configuration>

这个配置文件中定义了一个名为 Routing 的 Appender,用于按照日志文件名将日志输出到不同的文件中。Routing Appender 使用了 Routes 和 Route 元素,将日志按照日志文件名的不同路由到不同的 File Appender 中,实现了将日志输出到多个文件的功能。

输出Elasticsearch

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="org.apache.logging.log4j.core,com.fasterxml.jackson.databind.json">
  <Appenders>
    <Elasticsearch name="elasticsearch" type="http" index="log4j2" indexDateFormat="yyyy-MM-dd" ignoreExceptions="false">
      <ServerHost>localhost</ServerHost>
      <ServerPort>9200</ServerPort>
      <IndexType>doc</IndexType>
      <SourceHost>${env:HOSTNAME}</SourceHost>
      <JacksonJsonLayout compact="true" />
    </Elasticsearch>
  </Appenders>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="elasticsearch" />
    </Root>
  </Loggers>
</Configuration>

上述配置文件中,<Elasticsearch> 元素定义了 Elasticsearch Appender 的配置,其中包含了以下属性:

配置多个Appenders

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <RollingFile name="RollingFile" fileName="/path/to/logs/myapp.log"
                     filePattern="/path/to/logs/myapp-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
        </Root>
    </Loggers>
</Configuration>

在这个例子中,我们定义了一个名为 Console 的 Appender 和一个名为 RollingFile 的 Appender。Console Appender 用于将日志输出到控制台,RollingFile Appender 用于将日志输出到文件。在 Loggers 元素中,我们将 Root logger 的 AppenderRef 分别设置为 Console 和 RollingFile,表示将日志同时输出到控制台和文件中。

每个 Appender 必须有一个唯一的 name 属性,用于在其他地方引用该 Appender。在 Loggers 元素中,可以通过 AppenderRef 元素来引用一个或多个 Appenders,并将它们附加到特定的 Logger 上。也可以通过 Logger 元素来定义一个新的 Logger,并将其与一个或多个 Appenders 关联起来。

输出到kafka

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="org.apache.logging.log4j.core,com.fasterxml.jackson.databind.json">
  <Appenders>
        <Kafka name="Kafka" topic="myTopic" syncSend="false">
            <Property name="bootstrap.servers">localhost:9092</Property>
            <Property name="acks">1</Property>
            <Property name="batch.size">32768</Property>
            <Property name="compression.type">snappy</Property>
            <Property name="retries">20</Property>
            <Property name="reconnect.backoff.ms">20000</Property>
            <Property name="retry.backoff.ms">20000</Property>
            <PatternLayout pattern="${LOG_PATTERN}" charset="utf-8"/>
        </Kafka>
  </Appenders>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="Kafka" />
    </Root>
  </Loggers>
</Configuration>

Kafka

配置异步日志记录器

在 log4j2 中,可以使用异步日志记录器来提高性能和吞吐量。

异步日志记录器可以将日志事件放入一个队列中,然后由另外的线程或线程池来处理队列中的日志事件,从而降低了日志记录对应用程序的影响。

下面是在 log4j2.xml 中配置异步日志记录器的示例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
        <Async name="AsyncConsole" bufferSize="16384" queueSize="500" ringBufferSize="1024" blocking="false">
            <AppenderRef ref="Console"/>
        </Async>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="AsyncConsole"/>
        </Root>
    </Loggers>
</Configuration>

<Async> 元素是 Log4j2 中用于实现异步日志输出的 Appender。以下是 <Async> 元素中各个参数的解释:

以上就是SpringBoot日志框架之Log4j2快速入门与参数详解的详细内容,更多关于SpringBoot Log4j2入门的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文