SpringBoot基础 | 第四章 - 日志配置

SpringBoot 默认使用 Logback 作为日志输出工具,同时也支持 Java Util Logging 及 Log4J2。

一、显式引入 logback 依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

二、设置日志输出级别
日志级别从低到高分为

TRACE < DEBUG < INFO < WARN < ERROR < FATAL


日志级别配置的前缀为 logging.level

root 用于设置应用的日志级别,也可以对指定包设置单独的日志级别

logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

三、文件输出
默认情况下,SpringBoot 只输出日志至控制台,不会输出到文件。

但其实 SpringBoot 的日志默认配置中是有设置文件输出的,通过属性 logging.file 或 logging.path 进行开启

logging.file 设置文件,可以是绝对路径,也可以是相对路径。该配置比 logging.path 优先级更高。
logging.path 设置目录,会在该目录下创建spring.log文件。
logging.path=/var/log/
logging.file=/var/log/log.log

三、自定义 logback 日志输出
SpringBoot 默认会加载 logback-spring.xml 或者 logback.xml 中的配置,SpringBoot 推荐使用 logback-spring.xml。

日志中可以使用的配置属性

属性名    参数名    说明
logging.exception-conversion-word    LOG_EXCEPTION_CONVERSION_WORD    
logging.file    LOG_FILE    日志输出文件名
logging.path    LOG_PATH    日志输出路径
logging.file.max-size    LOG_FILE_MAX_SIZE    输出日志文件大小限制
logging.file.max-history    LOG_FILE_MAX_HISTORY    输出日志保留数量
logging.pattern.console    CONSOLE_LOG_PATTERN    日志输出格式(命令行)
logging.pattern.dateformat    LOG_DATEFORMAT_PATTERN    日志输出时间格式
logging.pattern.file    FILE_LOG_PATTERN    日志输出格式(文件)
logging.pattern.level    LOG_LEVEL_PATTERN    日志级别输出格式,默认为(%5p)
PID    PID    当前应用的PID
格式

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
...
</configuration>

参数介绍

scan 为 true 时,配置文件如果发生改变,将会被重新加载,默认为 true。
scanPeriod 扫描间隔时间,默认单位为毫秒,默认为 1 分钟。
debug 为 true 时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
节点介绍

1、contextName

设置上下文名称,默认为 default,通过 %contextName 来打印日志上下文名称,一般来说我们不用这个属性。

<contextName>logback</contextName>

2、property

设置变量,可以使“${}”来使用变量。

<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%15.15t] %-40.40logger{39} : %m%n"/>
<property name="LOG_FILE" value="spring.log"/>
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%t] %-40.40logger{39} : %m%n"/>

3、root

必选节点,用来指定日志输出级别,只有一个level属性,默认是DEBUG。

<root level="debug">
  <appender-ref ref="console" />
  <appender-ref ref="file" />
</root>

4、appender

ConsoleAppender
输出至控制台

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>${CONSOLE_LOG_PATTERN}</pattern>
    </encoder>
</appender>

RollingFileAppender
输出至文件,当文件达到指定大小时自动进行切分

<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <encoder>
        <pattern>${FILE_LOG_PATTERN}</pattern>
    </encoder>
    <!-- 如果没有 file 属性,那么只会使用 fileNamePattern 的文件路径规则 -->
    <!-- 如果即有 file 属性又有 fileNamePattern 属性,那么当天日志文件名使用 file 的配置,而以往的日志文件则会使用 fileNamePattern 的配置-->
    <file>${LOG_FILE}</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <!-- 文件路径,定义了日志的切分方式,把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间 -->
        <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
        <!-- 单个日志文件最大值,大于该值时则会根据 fileNamePattern 规则 %i 生成新的日志文件 -->
        <maxFileSize>10MB</maxFileSize>
        <!-- 只保留最近30天的日志 -->
        <maxHistory>30</maxHistory>
    </rollingPolicy>
</appender>

5、logger

对指定包或者指定类进行日志输出设置

设置包 com.msf.controller 的日志打印级别为 warn,且只在命令行输出

<logger name="com.msf.controller" level="WARN" additivity="false">
    <appender-ref ref="console"/>
</logger>

测试

@RequestMapping("/")
public String sayHello() {
    LOGGER.info("info");
    LOGGER.debug("debug");
    LOGGER.warn("warn");
    LOGGER.error("error");
    return "Hello";
}

可以看到命令行输出内容如下,info 以及 debug 的内容并没有被输出,查看日志文件则没有任何输出

WARN --- [nio-8080-exec-2] com.msf.controller.HelloController       : warn
ERROR --- [nio-8080-exec-2] com.msf.controller.HelloController      : error

范围有重叠的话,范围小的有效。

6、springProfile

多环境日志输出,多个 profile 使用逗号间隔,也可以使用 ! 表示否的意思

<!-- 开发、测试环境 -->
<springProfile name="test,dev">
    <logger name="com.msf.controller" level="DEBUG" additivity="false">
        <appender-ref ref="console"/>
    </logger>
</springProfile>

<!-- 生产环境 -->
<springProfile name="prod">
    <logger name="com.msf.controller" level="WARN" additivity="false">
        <appender-ref ref="console"/>
        <appender-ref ref="file" />
    </logger>
</springProfile>

配置 profile

spring.profiles.active=dev

7、springProperty

在日志配置文件中引用 application.properties 配置

在 application.properties 中添加配置

app.name=msf

在 logback-spring.xml 中添加 springProperty 元素对 app.name 进行引用

<springProperty scope="context" name="appname" source="app.name"/>

springProperty 的使用跟 property 元素是一样的

最后帖一下通过本文系列操作后,形成最终配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <springProperty scope="context" name="appName" source="app.name"/>

    <property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${appName}--- [%15.15t] %-40.40logger{39} : %m%n"/>
    <property name="LOG_FILE" value="spring.log"/>
    <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%t] %-40.40logger{39} : %m%n"/>


    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- 如果没有 file 属性,那么只会使用 fileNamePattern 的文件路径规则 -->
        <!-- 如果即有 file 属性又有 fileNamePattern 属性,那么当天日志文件名使用 file 的配置,而以往的日志文件则会使用 fileNamePattern 的配置-->
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 文件路径,定义了日志的切分方式,把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间 -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
            <!-- 单个日志文件最大值,大于该值时则会根据 fileNamePattern 规则 %i 生成新的日志文件 -->
            <maxFileSize>10MB</maxFileSize>
            <!-- 只保留最近30天的日志 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- 开发、测试环境 -->
    <springProfile name="test,dev">
        <logger name="com.msf.controller" level="DEBUG" additivity="false">
            <appender-ref ref="console"/>
        </logger>
    </springProfile>

    <!-- 生产环境 -->
    <springProfile name="prod">
        <logger name="com.msf.controller" level="WARN" additivity="false">
            <appender-ref ref="console"/>
            <appender-ref ref="file" />
        </logger>
    </springProfile>

    <root level="debug">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>
</configuration>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你使用Spring Boot打包项目生成一个包含-SNAPSHOT版本号的JAR(例如 `-SNAPSHOT.jar`)时,通常情况下这个JAR文件会自动包含一个Maven或Gradle的主清单(`Manifest.MF`),该清单包含了应用程序的基本元数据,如主类(Main-Class)等。然而,如果你发现打包后的JAR没有主清单,可能是因为以下原因: 1. **配置问题**:在构建配置(Maven的pom.xml或Gradle的build.gradle)中,没有明确指定主类或者没有正确配置打包行为。检查是否有`<mainClass>`标签在Maven的`<jar>`元素中,或者Gradle的`jar`任务。 2. **插件问题**:某些插件可能没有正确处理打包过程,尤其是对于自定义构建流程的配置,比如使用Spring Boot的插件或第三方构建工具时。 3. **排除清单**:如果你手动排除了主清单文件,或者配置了不包含主清单的打包选项,这可能导致主清单缺失。 4. **IDE构建**:某些IDE(如IntelliJ IDEA)可能会根据项目的设置自动处理打包,如果没有正确配置,也可能会导致缺少主清单。 解决这个问题,你可以按照以下步骤检查: - **检查构建脚本**:确保主类被正确配置,并且没有排除主清单文件。 - **更新插件和配置**:确保使用的构建工具(如Maven或Gradle)和Spring Boot插件是最新的,并且配置正确。 - **重新构建**:尝试清理并重新构建项目,有时IDE缓存的问题可能会导致意外的结果。 - **查看日志**:查找编译或打包过程中可能的错误信息。 相关问题: 1. 如何在Spring Boot的Maven/Gradle配置中添加主清单? 2. 如果主清单不存在,IDE如何手动配置添加主类信息? 3. 如何在打包命令行中确认是否正确指定了主类?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值