2023-03-11  阅读(1)
原文作者:柒's Blog 原文地址:https://blog.52itstyle.vip/archives/1304/

有一种力量无人能抵挡,它永不言败生来倔强。有一种理想照亮了迷茫,在那写满荣耀的地方。

202303111615591981.png

概述

参考文档:Logging

这里顺便引用以下部分原文,当然看不明白也没关系,我们有有道翻译,如果翻译的不准确,后面会提供详细配置分享给大家。

Spring Boot uses Commons Logging for all internal logging, but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging, Log4J2 and Logback. In each case loggers are pre-configured to use console output with optional file output also available.
By default, If you use the ‘Starters’, Logback will be used for logging. Appropriate Logback routing is also included to ensure that dependent libraries that use Java Util Logging, Commons Logging, Log4J or SLF4J will all work correctly.

使用

pom.xml相关配置就不跟大家在这里扯了,依赖自行添加。

Console output

配置日志的相关参数也只需要写在 application.properties或者application.yml中就可以了,当然,这仅仅是基本的配置。

    #官方文档中有提到, SpringBoot 的 Logging 配置的级别有7个:TRACE , DEBUG , INFO , WARN , ERROR , FATAL , OFF
    #root日志以INFO级别输出
    logging.level.root=INFO
    #springframework.web日志以WARN级别输出
    logging.level.org.springframework.web=WARN
    #hibernate日志以ERROR级别输出
    logging.level.org.hibernate=ERROR

加入以上配置后,我们启动项目,就可以在控制台打印Log信息了。

但是,在生产环境中,日志往往要以文件形式存放到服务器,下面介绍一下spring-boot日志的文件输出方式。

File output

    logging.file=spring_boot.log
    logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
    logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n

配置完成以后,我们再次启动项目,这时候会在根目录下生成一个spring_boot.log日志文件。

但是,经历过项目上线的小伙伴,其实这样配置远远达不到生产要求。比如,区分普通日志和错误日志,按照日期存储日志,配置单个日志文件最大容量,删除多少天之前的文件等等!下面与大家分享一款更高级的配置。

Custom log configuration

Depending on your logging system, the following files will be loaded:

Logback: logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy

Log4j2: log4j2-spring.xml or log4j2.xml

JDK (Java Util Logging): logging.properties

spring-boot日志管理支持Logback,Log4j2以及Log4j,根据以上说明,我们可以定义文件命名。

下面我们使用Logback的指定配置文件实现更高级的日志配置。

logback-spring.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- scan 配置文件如果发生改变,将会被重新加载  scanPeriod 检测间隔时间-->
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
        <contextName>spring-boot-log</contextName>
        <include resource="org/springframework/boot/logging/logback/base.xml"/>
        <!-- 普通日志 -->
        <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>log/spring-boot-log-info.log</file>
            <!-- 循环政策:基于时间创建日志文件 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                 <!-- 日志命名:单个文件大于128MB 按照时间+自增i 生成log文件 -->
                <fileNamePattern>log/spring-boot-log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>128MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!-- 最大保存时间:30天-->
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <append>true</append>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
                <charset>utf-8</charset>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>info</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
         <!-- 错误日志 -->
        <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>log/spring-boot-log-error.log</file>
            <!-- 循环政策:基于时间创建日志文件 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 日志命名:单个文件大于2MB 按照时间+自增i 生成log文件 -->
                <fileNamePattern>log/spring-boot-log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>2MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!-- 最大保存时间:180天-->
                <maxHistory>180</maxHistory>
            </rollingPolicy>
            <append>true</append>
            <!-- 日志格式 -->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
                <charset>utf-8</charset>
            </encoder>
            <!-- 日志级别过滤器 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                 <!-- 过滤的级别 -->
                 <level>ERROR</level>
                 <!-- 匹配时的操作:接收(记录) -->
                 <onMatch>ACCEPT</onMatch>
                 <!-- 不匹配时的操作:拒绝(不记录) -->
                 <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
        <!-- 控制台 -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <!-- 日志格式 -->
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
                <charset>utf-8</charset>
            </encoder>
            <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
        </appender>
        <!-- additivity 避免执行2次 -->
        <logger name="com.itstyle"  level="INFO"  additivity="false">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="INFO_FILE"/>
            <appender-ref ref="ERROR_FILE"/>
        </logger>
        <root level="INFO">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </configuration>

如果我们使用了 Logback 的指定配置文件的话,那么application.properties 中的配置可以取消了。

测试

配置完成后,我们做一个测试,为了测试方便把info和error日志容量maxFileSize都改为2MB。

然后启动程序:

    /**
     * 创建者  https://blog.52itstyle.vip
     * 创建时间    2017年7月24日
     */
    @EnableAutoConfiguration
    public class Application  {
        private static final Logger logger = LoggerFactory.getLogger(Application.class);
        
        public static void main(String[] args) throws InterruptedException {
            SpringApplication.run(Application.class, args);
              while(true){
                logger.info("普通日志");
                logger.error("错误日志");
              }
        }
    }

执行一段时间,如果在项目路径下生成以下日志文件说明配置成功。

202303111615597122.png

代码:http://git.oschina.net/52itstyle/spring-boot-log


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文