SpringBoot日志框架之Log4j2快速入门与参数详解
作者:莫念Program
Quick Start
在SpringBoot中使用log4j2日志框架,只需三步:
- 引入依赖
- 配置log文件
- 获取Logger实例并输出日志
引入依赖
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 中的重要标签:
<Configuration>
:定义整个配置文件的根元素,它有一个 status 属性,用于控制日志框架的日志输出级别。status 属性的值可以是 ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL 或 OFF 中的任何一个,默认值为 OFF。<Appenders>
:定义日志输出器的集合,可以包含多个 Appender。每个 Appender 可以有自己的日志输出方式和格式化方式,以满足不同的需求。<Logger>
:定义一个 Logger 对象,它可以有自己的日志级别、Appenders 和过滤器等属性。Logger 元素还可以通过子元素<AppenderRef>
来引用一个或多个 Appenders,将它们附加到该 Logger 上。<Root>
:定义 Root Logger 对象,它是所有 Logger 的父 Logger。它的级别通常设置为最低级别,以便将所有日志消息传递到其他 Logger 或 Appender。Root 元素也可以通过子元素<AppenderRef>
来引用一个或多个 Appenders,将它们附加到 Root Logger 上。<Filter>
:定义一个或多个过滤器,用于控制哪些日志消息被记录和输出。过滤器可以根据日志级别、消息内容、时间戳等条件进行过滤。<PatternLayout>
:定义日志格式化器,用于将日志消息格式化成一行一行的文本。PatternLayout 可以使用一系列占位符,表示日志消息的不同部分,例如时间戳、线程名、日志级别、类名、方法名、消息内容等。<RollingFile>
:定义一个 RollingFile Appender,用于将日志输出到文件,并实现滚动文件的功能。RollingFile Appender 可以按照时间、文件大小等条件进行滚动,并设置最多保留多少个日志文件。<Console>
:定义一个 Console Appender,用于将日志输出到控制台。<Elasticsearch>
:定义一个 Elasticsearch Appender,用于将日志输出到 Elasticsearch 中。
输出到控制台
<?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格式化字符串含义如下:
%d{yyyy-MM-dd HH:mm:ss.SSS}
:输出日志时间的格式,其中yyyy表示四位年份,MM表示两位月份,dd表示两位日期,HH表示24小时制的小时数,mm表示分钟数,ss表示秒数,SSS表示毫秒数。[%t]
:输出线程名称。%-5level
:输出日志级别,其中-
表示左对齐,5
表示占位符宽度,level
表示日志级别。%logger{36}
:输出logger名称,其中36表示logger名称的最大宽度。%msg%n
:输出日志消息和换行符。
该文件还定义了一个 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 的配置,其中包含了以下属性:
name
:指定 Appender 的名称,可自定义。type
:指定 Elasticsearch 连接类型,这里使用的是 HTTP连接方式。index
:指定 Elasticsearch 中的索引名称。indexDateFormat
:指定日志索引的日期格式。ignoreExceptions
:指定是否忽略异常,如果设置为false
,则在出现异常时会中断应用程序。ServerHost
:指定 Elasticsearch 服务器的主机名或 IP 地址。ServerPort
:指定 Elasticsearch 服务器的端口号。IndexType
:指定 Elasticsearch 索引类型。SourceHost
:指定日志来源的主机名或 IP 地址。JacksonJsonLayout
:指定日志输出的格式,这里使用了 JacksonJsonLayout。
配置多个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
topic
属性:指定 Kafka 主题的名称,这里设置为myTopic
。bootstrap.servers
属性:指定 Kafka 服务器的地址和端口号,这里设置为localhost:9092
。acks
属性:指定 Kafka 生产者的确认级别。这里设置为1
,表示只需要 Kafka 生产者收到消息就返回确认消息。batch.size
属性:指定 Kafka 生产者批量发送消息的大小。这里设置为32768
。compression.type
属性:指定消息的压缩类型,这里设置为snappy
。retries
属性:指定 Kafka 生产者在发生错误时的重试次数。这里设置为20
。reconnect.backoff.ms
属性:指定 Kafka 生产者在重新连接到 Kafka 服务器之前的等待时间。这里设置为20000
毫秒。retry.backoff.ms
属性:指定 Kafka 生产者在发生错误时的重试等待时间。这里设置为20000
毫秒。
配置异步日志记录器
在 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>
元素中各个参数的解释:
name
:指定异步 Appender 的名称,可自定义。bufferSize
:指定异步队列的缓冲区大小,即可以同时缓存的日志事件的数量。当队列已满时,新的日志事件会被直接丢弃。queueSize
:指定异步队列的容量,即可以缓存的日志事件的最大数量。当超过此数量时,新的日志事件会被直接丢弃。ringBufferSize
:指定异步队列的环形缓冲区大小,这是一个循环队列,大小必须是 2 的幂次方。如果未指定bufferSize
,则使用ringBufferSize
作为缓冲区大小。blocking
:指定是否使用阻塞模式。如果设置为true
,则当队列已满时,新的日志事件将会被阻塞,直到队列中有空闲位置。如果设置为false
,则当队列已满时,新的日志事件会被直接丢弃。AppenderRef
:指定异步 Appender 的输出目的地。
以上就是SpringBoot日志框架之Log4j2快速入门与参数详解的详细内容,更多关于SpringBoot Log4j2入门的资料请关注脚本之家其它相关文章!