跳至主要內容

Spring Boot logback简介

xw大约 4 分钟SpringJavaSpring Boot

logback简介

Logbackopen in new window是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。
SLF4Jopen in new window —— Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一Facade抽象。Java日志框架众多——常用的有java.util.logging, log4j, logbackcommons-logging, Spring框架使用的是Jakarta Commons Logging API(JCL)。而SLF4J定义了统一的日志抽象接口,而真正的日志实现则是在运行时决定的——它提供了各类日志框架的绑定。

logback与log4j相比优势

  • 更快的执行速度。某些关键地方速度大约提高了十倍,并且占用的内存更小。
  • 大量的测试。与log4j更稳定、效率更高
  • 支持SLF4J
  • 大量的文档
  • IO故障自动恢复机制
  • 更强的filter筛选功能
  • ..

总结:
logback建立在log4j的基础上,logback只是更好的log4j。

springboot继承logback

添加maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

我们的Spring Boot应用将自动使用logback作为应用日志框架,Spring Boot启动的时候,由org.springframework.boot.logging.Logging-Application-Listener根据情况初始化并使用。

控制台输出

日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出,只会显示ERROR信息。

文件输出

默认情况下,springboot不会在文件中进行输出,如果我们需要在文件中进行输出保存,可以在applition.properties进行配置。

# 指定日志文件的名字
logging.file.name=
#指定日志保存路径
logging.file.path=

自定义文件配置

由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。
根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:

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

  • Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml

  • Log4j2:log4j2-spring.xml, log4j2.xml

  • JDK (Java Util Logging):logging.properties

配置文件路径:
image.png

如果需要自定义配置文件名,需要在application.properties指定文件名。

logback-spring.xml例子

<?xml version="1.0" encoding="UTF-8"?>
<!-- <configuration debug="true"> 调试模式下,可输出logback的内部日志信息 -->
<configuration>
    <!-- 定义变量 -->
    <property name="LOG_HOME" value="${user.dir}" />
    <!-- 引用其它文件的设置 <property file="res/log_config.properties" /> -->
    <!-- appender(输出端) 此处是控制台输出,用的是ConsoleAppender,STDOUT,此名字随意起,和root下的一致就行 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

        <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 文件输出1 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <!-- 输出文件名 -->
        <!-- <file>${LOG_HOME}/logs/mylog.log</file> -->
        <!-- 输出文件名,引用其它文件的设置 -->
        <file>${app_home}/mylog.log</file>
        <encoder>
            <!--%date日期 %level日志级别 [%thread]当前线程 %logger{50}输出日志的类,50代表包名加类名的总长度限制 [%file:%line]日志所在文件及行数 %msg%n消息及换行 -->
            <pattern>%date %level [%thread] %logger{50} [%file:%line] %msg%n
            </pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE2" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <FileNamePattern>${LOG_HOME}/ifproxy_%d{yyyy-MM-dd}.log</FileNamePattern>
            <!-- 最多日志文件数,必须和CleanHistoryOnStart一起使用 -->
            <MaxHistory>3</MaxHistory>
            <CleanHistoryOnStart>true</CleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <!--%date日期 %level日志级别 [%thread]当前线程 %logger{50}输出日志的类,50代表包名加类名的总长度限制 [%file:%line]日志所在文件及行数 %msg%n消息及换行 -->
            <pattern>%date %level [%thread] %logger{50} [%file:%line] %msg%n
            </pattern>
        </encoder>
    </appender>
    <!-- 级别定义,输出端内容输出级别,大于或等于root定义的level,方能在输出端输出 -->
    <root level="info">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE2" />
    </root>
    <!-- 单独为某些类定输出级别 -->
    <logger name="com.log.test.Test2" level="info"></logger>
    <!--  将指定类(mytest.lala.Test)的日志单独输出到指定的日志文件中(control2)
    <appender name="FILE3" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/%d{yyyyMM}/control2_%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <logger name="mytest.lala.Test">
        <appender-ref ref="FILE3" />
    </logger>
    -->
</configuration>