Spring Boot 日志

Posted Dante丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 日志相关的知识,希望对你有一定的参考价值。

日志框架是任何一套系统中不可获取的部分,我们需要通过日志来记录用户的有效操作。
 
 
JUL: JDK 自带的Logging(实现太过简陋,对开发者不友好)
JCL: Jakarta Commons Loggin(Apache)()
Log4j:(作者是ceki,Log4j是作者选择放弃而推荐Logback)
Log4j2:(Apache,过于先进,开源框架对其支持有限,最大的优势是高于Log4j的超高性能)
Logback:(作者是ceki,真正意义上的Log4j2)
SLF4j:(作者是ceki
jboss-logging:(诞生之初就不是为了服务大众,也没有收到青睐)
 
 

简单的日志示例

 
一个简单的日志示例:
import org.slf4j.Logger;

@RunWith(SpringRunner.class)
// 指定上下文,让日志运行于Spring环境
@SpringBootTest
public class LoggerTest {
    private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);

    @Test
    public void test1() {
        logger.debug("debug...");
        logger.info("info...");
        logger.error("error...");
    }
}

 

 
输出结果:
 
之所以没有打印debug的内容是因为系统默认打印info以上的内容,那么系统有哪些层级呢?
 
查看系统的层级
ctrl + N (windows) 查找类:
 
 
 
从上面的代码我们可以看到我们需要用到LoggerFactory.getLogger(类名),才能让输出的时候打印出本类的类名。这样每次都要配置就非常麻烦,那么我们可以借助一个小插件,来优化这个过程。
lombok插件 —— 这个插件不仅可以帮我们简化getter,setter方法的编写,还能帮我们减少很多代码的编写,也能帮助我们优化日志的使用,具体安装及配置见如下连接:lombok在idea中安装以及使用
 
利用lombok优化后,代码如下:
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class LoggerTest {
    @Test
    public void test1() {
        String name = "imooc";
        String password = "123456";
        log.debug("debug...");
        log.info("info...");
        log.info("name: {}, password: {}", name, password);
        log.error("error...");
    }
}

 

 
运行结果如下:
 
 

Logback的配置

通过修改Logback的配置,可以个性化完成我们的日志需求,也能实现上面讲过的各种功能。
配置的Logback的文件
appilcation.yml (配置简单,功能简单)
logback-spring.xml (配置复杂,功能强大)

假设我们有以下两个需求:

区分info和error日志
每天产生一个日志文件

 

具体配置过程
配置application.yml
logging:
  pattern:
#    console: "%d - %msg%n" # 指定控制到输出格式,但日志文件可以看到详细信息
#  path: /var/log/tomcat/   # 指定输出路径
  file: /var/log/tomcat/sell.log  #指定输出文件
  level: debug #指定日志级别
  level:
    com.dante.imooc.sell.LoggerTest: debug #指定某一类的日志级别

 

 
application.yml只能简单的配置一些指定路径,如果我们需要完成更复杂的目标,就需要更详细的配置。
 
配置logback-spring.xml指定不同level的日志到不同的文件,并且按时间滚动。
1.resources目录下新建logback-spring.xml文件
2.进行日志输出配置,配置示例如下:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <Layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %d - %msg%n
            </pattern>
        </Layout>
    </appender>

    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <!--禁止-->
            <onMatch>DENY</onMatch>
            <!--接受-->
            <onMismatch>ACCEPT</onMismatch>
            <!--命中ERROR就DENY,没有命中ERROR就ACCEPT-->
            <!--filter三种操作,DENY(禁止),NEUTRAL(中立),ACCEPT(接受): 分别对应拒绝,忽略,接受-->
        </filter>
        <encoder>
            <pattern>
                %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>/var/log/tomcat/sell/info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>/var/log/tomcat/sell/error.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>

 

 
3.关于配置的细节可以参照依赖库“org.springframework.boot.logging.logback”的下列文件:
base.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->

<included>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</included>

 

 
defaults.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
Default logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->

<included>
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <appender name="DEBUG_LEVEL_REMAPPER" class="org.springframework.boot.logging.logback.LevelRemappingAppender">
        <destinationLogger>org.springframework.boot</destinationLogger>
    </appender>

    <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
    <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
    <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
    <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
    <logger name="org.apache.tomcat.util.net.NioselectorPool" level="WARN"/>
    <logger name="org.crsh.plugin" level="WARN"/>
    <logger name="org.crsh.ssh" level="WARN"/>
    <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
    <logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
    <logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="WARN"/>
    <logger name="org.springframework.boot.actuate.endpoint.jmx" additivity="false">
        <appender-ref ref="DEBUG_LEVEL_REMAPPER"/>
    </logger>
    <logger name="org.thymeleaf" additivity="false">
        <appender-ref ref="DEBUG_LEVEL_REMAPPER"/>
    </logger>
</included>

 

 
 
 
file-appender.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
File appender logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->

<included>
    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%i</fileNamePattern>
        </rollingPolicy>
        <triggeringPolicy
            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
</included>

 

 
console-appender.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
Console appender logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->

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

 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





以上是关于Spring Boot 日志的主要内容,如果未能解决你的问题,请参考以下文章

分享spring boot controller统一日志代码

spring boot logbackspring boot中logback日志乱码问题

spring boot 2-日志

一张图,理顺 Spring Boot应用在启动阶段执行代码的几种方式

一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式

禁用 Spring Boot Webclient 日志