SpringBoot支持哪些日志框架?推荐和默认的日志框架是哪个?

一、介绍

1、支持的类型

SpringBoot支持多种日志框架,包括Logback、Log4j2和Java Util Logging(JUL)。默认情况下,如果你使用SpringBoot的starters启动器,它将使用Logback作为日志框架。

Logback:Logback是SpringBoot默认的日志框架,它是Log4j的继任者,提供了更好的性能和可靠性。你可以通过在资源目录下创建一个logback-spring.xml文件来配置Logback。
Log4j2:Log4j2是Log4j的升级版,它在性能和功能上都有所提升,支持异步日志和插件机制。如果你想在SpringBoot中使用Log4j2,你需要添加相应的依赖并在配置文件中指定Log4j2作为日志框架。
Java Util Logging(JUL):JUL是Java SE的默认日志框架,SpringBoot可以配置使用JUL作为日志框架,但一般不推荐使用,因为它的性能和灵活性相对较差。
除了上述日志框架外,SpringBoot还支持SLF4J和Commons Logging这两个日志门面。这些门面可以与多种日志实现进行集成,使得你可以在不改变代码的情况下更换日志框架。

无论使用哪种日志框架,SpringBoot都支持配置将日志输出到控制台或者文件中。你可以在application.properties或application.yml配置文件中设置日志级别、输出格式等参数。

2、日志级别

在日志系统中,通常会定义不同的日志级别,用于标识日志的重要性或严重性。以下是常见的日志级别,按照从低到高的顺序排列:

ALL:所有日志。
DEBUG:用于调试信息,通常用于开发和调试阶段。
INFO:提供程序运行时的重要信息,用于指示应用程序正常运行。
WARN:表示潜在的问题,不会导致应用程序失败,但可能需要关注。
ERROR:表示错误事件,可能导致应用程序出现问题。
OFF:关闭日志。

二、实战

下面我们主要介绍2种比较常用的日志框架

1、logback

添加依赖

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

在src/main/resources目录下创建一个名为logback-spring.xml的配置文件,Spring Boot会默认加载这个配置文件。Spring Boot官方推荐优先使用带有-spring的文件名作为日志配置。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 定义全局变量,日志文件路径和格式 -->
    <property name="log.path" value="${LOG_PATH}"/>
    <property name="log.name" value="${LOG_FILE}"/>
    <property name="file.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} - %msg%n"/>

    <!-- 控制台输出配置 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${file.pattern}</pattern>
        </encoder>
        <!-- 只输出DEBUG级别及以上的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>

    <!-- 文件输出配置 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${log.name}.info.log</file>
        <encoder>
            <pattern>${file.pattern}</pattern>
        </encoder>
        <!-- 只输出INFO级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/${log.name}.info.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 每个文件最大10MB -->
            <maxFileSize>10MB</maxFileSize>
            <!-- 最多保留30天的历史记录 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- 文件输出配置 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${log.name}.error.log</file>
        <encoder>
            <pattern>${file.pattern}</pattern>
        </encoder>
        <!-- 只输出ERROR级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/${log.name}.error.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 每个文件最大10MB -->
            <maxFileSize>10MB</maxFileSize>
            <!-- 最多保留30天的历史记录 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- 设置root logger -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="INFO_FILE"/>
        <appender-ref ref="ERROR_FILE"/>
    </root>

</configuration>

filter过滤器参数说明:

  • ThresholdFilter:基于单个日志级别进行过滤,简单但功能有限。
  • LevelFilter:基于一个范围的日志级别进行过滤,提供了比 ThresholdFilter 更多的灵活性。
  • EvaluatorFilter:基于自定义表达式进行过滤,提供了最大的灵活性。

添加配置文件,定义我们的日志文件路径和文件名

logging.file.path=D:/dev
logging.file.name=forlan-old

使用的话,可以通过依赖注入或静态方式来使用Logger,如下:

public class LogController {

	private static final Logger logger = LoggerFactory.getLogger(LogController.class);

	@PostMapping("/logback")
	public String logback(String value) {
		logger.trace("logback测试trace日志打印");
		logger.debug("logback测试debug日志打印");
		logger.info("logback测试info日志打印");
		logger.warn("logback测试warn日志打印");
		logger.error("logback测试error日志打印");
		return value;
	}
}

2、Log4j2

添加Log4j2依赖,并排除Spring Boot的默认日志配置

<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>
</dependency>

在src/main/resources目录下创建一个名为log4j2-spring.xml的配置文件,Spring Boot会默认加载这个配置文件。Spring Boot官方推荐优先使用带有-spring的文件名作为日志配置。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <!-- 定义全局变量,日志文件路径和格式 -->
    <Properties>
        <Property name="log.path">D:/dev</Property>
        <Property name="log.name">forlan-log4j2</Property>
        <Property name="file.pattern">%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{50} - %msg%n</Property>
    </Properties>

    <!-- 控制台输出配置 -->
    <Appenders>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="${file.pattern}"/>
            <ThresholdFilter level="DEBUG"/>
        </Console>

        <!-- 文件输出配置 -->
        <RollingFile name="INFO_FILE" fileName="${log.path}/${log.name}.info.log"
                     filePattern="${log.path}/%d{yyyy-MM-dd}/${log.name}.info.%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="${file.pattern}"/>
            <LevelMatchFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 每个文件最大10MB -->
            <SizeBasedTriggeringPolicy size="10MB"/>
            <!-- 最多保留30天的历史记录 -->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>

        <!-- 文件输出配置 -->
        <RollingFile name="ERROR_FILE" fileName="${log.path}/${log.name}.error.log"
                     filePattern="${log.path}/%d{yyyy-MM-dd}/${log.name}.error.%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="${file.pattern}"/>
            <LevelMatchFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 每个文件最大10MB -->
            <SizeBasedTriggeringPolicy size="10MB"/>
            <!-- 最多保留30天的历史记录 -->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>
    </Appenders>

    <!-- 设置root logger -->
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="STDOUT"/>
            <AppenderRef ref="INFO_FILE"/>
            <AppenderRef ref="ERROR_FILE"/>
        </Root>
    </Loggers>
</Configuration>

混淆参数说明:

  • <Configuration status=“DEBUG”>:设置了Log4j2框架本身的日志记录级别,也就是Log4j2内部操作和配置加载相关的调试信息。
  • <ThresholdFilter level=“DEBUG”>:设置的是我们代码中的日志记录级别,会影响被该过滤器作用的Appender。
  • <Root level=“DEBUG”>:设置的是我们代码中的日志记录级别,会影响根记录器及其子Logger,如果Appender没有设置就会默认使用它的

如果前面的文件名不是以-spring结尾,就需要添加配置文件,比如:

logging.config=classpath:log4j2.xml

使用的话,可以通过依赖注入或静态方式来使用Logger,如下:

public class LogController {

	private static final Logger logger = LoggerFactory.getLogger(LogController.class);

	@PostMapping("/log4j2")
	public String log4j2(String value) {
		logger.trace("log4j2测试trace日志打印");
		logger.debug("log4j2测试debug日志打印");
		logger.info("log4j2测试info日志打印");
		logger.warn("log4j2测试warn日志打印");
		logger.error("log4j2测试error日志打印");
		return value;
	}
}

三、总结

总的来说,推荐使用Logback,配置简单,性能也还不错,而且是SpringBoot的默认日志框架,此外,还可以支持skywalking,只需要简单改下配置即可,如下:

<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
        <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%tid] [%thread] %logger{50} - %msg%n</Pattern>
    </layout>
</encoder>
  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Forlan

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值