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将不能完全实例化

相关推荐
mitt_3 分钟前
go语言变量
开发语言·后端·golang
无限大619 分钟前
二维数组搜索:从暴力地毯到二分神技的奇幻之旅
后端
hrrrrb1 小时前
【Spring Boot 快速入门】六、配置文件
java·spring boot·intellij-idea
bobz9651 小时前
最近玩了好多把 LOL
后端
Asu52021 小时前
思途Mybatis学习 0805
java·spring boot·学习·mybatis
爱欲无极1 小时前
基于Flask的微博话题多标签情感分析系统设计
后端·python·flask
cwkiller1 小时前
heapdump深度利用之信息泄露篇
后端
心勤则明2 小时前
JVM(Java虚拟机)运行时数据区
java·jvm·chrome
皮皮林5512 小时前
多账号统一登录(实现方案)
java
越来越无动于衷2 小时前
智慧社区(八)——社区人脸识别出入管理系统设计与实现
java·开发语言·spring boot·python·mysql