Spring Boot日志配置

目录

logback

使用logback

获取日志对象

日志级别

控制日志输出级别

日志输出格式控制

配置方式

日志转存

示例


日志是应用程序不可或缺的一部分,记录着程序运行的信息。主要作用有:

  • 记录日常运营的重要信息
  • 记录应用报错信息
  • 记录过程数据等

logback

Logback 作为 Spring Boot 的默认日志实现框架,异步吞吐量相比于Log4j更加强大:

组件 说明
Logger 日志记录器,存放日志对象,负责日志分类和级别控制
Appender 指定日志输出目的地
Layout 日志格式转换成字符串,输出格式化的日志信息

使用logback

在SpringBoot项目中,导入了spring-boot-starter起步依赖,则默认导入了logback所需的依赖,同样导入spring-boot-starter-web也是如此:

获取日志对象

方法一:

复制代码
private static final Logger log = LoggerFactory.getLogger(LogbackApplication.class);
java 复制代码
log.warn("sdadas");
log.info("info...");
log.error("jksabnfijASBF");
log.debug("daskdhaoisjdhja");

注意:使用Logger时导入的包是org.slf4j下的,而不是java.util。
方法二:使用@Slf4j注解:

注:该方法在启用前要先启用lombok(SpringBoot内置了lombok)

XML 复制代码
  <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
  </dependency>

该方法省去了创建对象的麻烦,只需要加上@Slf4j注解,就会自动生成log变量。

日志级别

SpringBoot的日志级别用于控制日志输出的详细程度,日志级别越高,输出的日志越详细。

级别 说明
TRACE 运行堆栈信息,使用率低
DEBUG 调试时打印关键信息
INFO 普通的打印信息,记录运维过程数据
WARN 警告数据,不影响使用
ERROR 记录错误日志信息
FATAL 致命错误,代码异常导致程序退出的错误

控制日志输出级别

可以在springboot的配置文件中设置日志的输出级别:

XML 复制代码
logging:
  level:
    root: error

日志输出格式控制

对于单条日志信息来说,日期,触发位置,记录信息是最核心的信息。级别用于做筛选过滤,PID与线程名用于做精准分析。

配置方式

复制代码
logging:
  pattern:
    console: "%logger{36} - %msg%n"    #控制台输出格式
    file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" #文件输出格式
占位符 说明 示例输出
%d{yyyy-MM-dd HH:mm:ss} 日期时间,按照指定的格式输出。yyyy-MM-dd HH:mm:ss 表示年-月-日 时:分:秒。 2023-10-05 14:30:45
[%thread] 输出日志的线程名称,放在方括号中。 [main]
%-5level 日志级别,固定宽度为 5 个字符,左对齐。常见的级别有 INFODEBUGERROR 等。 INFO (注意后面有一个空格)
%logger{36} 日志记录器的名称,最多显示 36 个字符。如果名称超过 36 个字符,会进行截断。 com.example.MyClass
- 一个分隔符,用于分隔日志记录器名称和日志消息。 -
%msg 日志消息内容,即开发者在代码中记录的日志信息。 This is a log message.
%n 换行符,表示日志记录结束并换行。 (在文件中表现为换行)

示例:"%d{yyyy-MM-dd HH:mm:ss} %logger{36} - %msg%n"

日志转存

日志不仅能在控制台上显示,还可以存在文件中,方便后续的查阅。

配置方式:设置日志文件名即可

logging:

file:

path: ./logs/ #路径

示例

复制代码
logging:
  file:
    path: ./logs/

注意:不需要手动创建该路径,Springboot程序启动后会自动创建。如果不指定文件名,会自动默认创建在spring.log文件中。如果不修改路径,日志会追加在spring.log文件中。

对于线上复杂的情况,可以对日志文件进行配置:

首先创建一个logback的配置文件:

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds" debug="false">
    <!-- 日志路径 部署在服务器 文件夹需要设计777权限 -->
    <property name="log.base" value="C://logs/suke"/>
    <!--日志存储天数-->
    <property name="log.max.days" value="30"/>
    <!-- 日志文件大小 -->
    <property name="log.max.size" value="500MB"/>
    <!-- 输出格式-->
    <property name="log.pattern" value="%date{ISO8601} %level [%thread] %logger{56} : %msg%n"/>
    <!--字符集-->
    <property name="log.charset" value="UTF-8"/>

    <!--控制台-附加器 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
            <charset>${log.charset}</charset>
        </encoder>
    </appender>

    <!--info-附加器-->
    <appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <file>${log.base}/info/_info.log</file><!--存储路径-->
        <!-- 输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
            <charset>${log.charset}</charset>
        </encoder>
        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--按天回滚-->
            <fileNamePattern>${log.base}/info/archive/info_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <!--日志最大存储天数-->
            <maxHistory>${log.max.days}</maxHistory>
            <!--当天的日志 超过大小 压缩日志并保存 -->
            <maxFileSize>${log.max.size}</maxFileSize>
        </rollingPolicy>
        <!--过滤器,只记录INFO级别的日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--warn-附加器-->
    <appender name="warnFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.base}/warn/_warn.log</file><!--存储路径-->
        <!--输出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
            <charset>${log.charset}</charset>
        </encoder>
        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.base}/warn/archive/warn_%d{yyyy-MM-dd}.%i.log.zip
            </fileNamePattern>
            <!--日志最大存储天数-->
            <maxHistory>${log.max.days}</maxHistory>
            <!-- 当天的日志 超过大小 压缩日志并保存 -->
            <maxFileSize>${log.max.size}</maxFileSize>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--error-附加器-->
    <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.base}/error/_error.log</file><!--存储路径 -->
        <!--输出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
            <charset>${log.charset}</charset>
        </encoder>
        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.base}/error/archive/error_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <!--日志最大存储天数-->
            <maxHistory>${log.max.days}</maxHistory>
            <!-- 当天的日志 超过大小 压缩日志并保存 -->
            <maxFileSize>${log.max.size}</maxFileSize>
        </rollingPolicy>
        <!--级别-过滤器 error-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName -->
    <!--<logger name="org.springframework.aop.framework.CglibAopProxy" additivity="false">
        <level value="info" />
        <appender-ref ref="stdout" />
    </logger>-->
    <logger name="com.fs" additivity="false">
        <level value="debug" />
        <appender-ref ref="stdout" />
    </logger>
    <!-- root将级别为"DEBUG"及大于"DEBUG"的日志信息交给已经配置好的名为"Console"的appender处理,"Console"appender将信息打印到Console -->
    <root level="info">
        <appender-ref ref="stdout" /> <!-- 标识这个appender将会添加到这个logger -->
        <appender-ref ref="infoFile" />
        <appender-ref ref="warnFile" />
        <appender-ref ref="errorFile" />
    </root>
</configuration>

注:Springboot会默认加载classpath:logback-spring.xml或者classpath:logback-spring.groovy或者:classpath:logback.xml,可自定义配置:

XML 复制代码
logging: 
  config: classpath:logback-suke.xml

不要使用logback-logback.xml这个来命名,否则spring boot将不能完全实例化

相关推荐
小马爱打代码17 分钟前
SpringBoot原生实现分布式MapReduce计算
spring boot·分布式·mapreduce
iuyou️20 分钟前
Spring Boot知识点详解
java·spring boot·后端
北辰浮光22 分钟前
[Mybatis-plus]
java·开发语言·mybatis
一弓虽32 分钟前
SpringBoot 学习
java·spring boot·后端·学习
南客先生36 分钟前
互联网大厂Java面试:RocketMQ、RabbitMQ与Kafka的深度解析
java·面试·kafka·rabbitmq·rocketmq·消息中间件
ai大佬39 分钟前
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
java·spring·自动化·api中转·apikey
姑苏洛言40 分钟前
扫码小程序实现仓库进销存管理中遇到的问题 setStorageSync 存储大小限制错误解决方案
前端·后端
光而不耀@lgy1 小时前
C++初登门槛
linux·开发语言·网络·c++·后端
Mr__Miss1 小时前
面试踩过的坑
java·开发语言
爱喝一杯白开水1 小时前
POI从入门到上手(一)-轻松完成Apache POI使用,完成Excel导入导出.
java·poi