Spring的日志管理logback

本文详细介绍了如何在Spring Boot项目中配置logback.xml,包括日志上下文、日志输出、文件格式、级别过滤和Spring应用示例。重点展示了如何设置控制台和文件日志,以及不同级别的日志输出控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本章节基于 SpringBoot讲解

🍓logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
    scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
    scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
    debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration debug="false" scan="true" scanPeriod="1 seconds">
    <!--设置日志上下文名称,可以通过%contextName来打印日志上下文名称-->
    <contextName>logback</contextName>
    <!--
        property:可以用来设置变量,可以通过${name}来访问,有以下的属性name和value和file
        file:用于指定配置文件的路径,他的作用在于,如果你有多个配置信息的话,可以直接写在配置文件中,然后通过file引入
        resource:作用和file一样,但是,它是可以直接从classpath路径下引入配置文件
    -->
    <property name="log.path" value="D:\\test\\logback.log" />

    <!--
        appender格式化日志输出节点,有两个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。
        appender有以下子节点:
            filter,日志输出拦截器,可以自定义拦截器也可以用系统一些定义好的拦截器
                level:过滤哪个级别以下的日志:DEBUG < INFO < WARN < ERROR
            encoder和pattern节点组合用于具体输出的日志格式
            file节点用来指明日志文件的输出位置,可以是绝对路径也可以是相对路径(控制台输出策略不需要,文件输出策略需要)
            rollingPolicy日志回滚策略,在这里我们用了TimeBasedRollingPolicy,基于时间的回滚策略,有以下子节点
                fileNamePattern,必要节点,可以用来设置指定时间的日志归档,例如我们上面的例子是每天将日志归档成一个zip包
                maxHistory ,可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,,例如设置为30的话,则30天之后,旧的日志就会被删除
                totalSizeCap,可选节点,用来指定日志文件的上限大小,例如设置为3GB的话,那么到了这个值,就会删除旧的日志

    -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- <filter class="com.example.logback.filter.MyFilter" /> -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36}.%method [%file : %line] - %msg%n
            </pattern>
        </encoder>
    </appender>

    <appender name="file"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <file>${log.path}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
        </rollingPolicy>

        <encoder>
            <!--
                %date:日志打印时间
                %level 日志级别:DEBUG、INFO、WARN和ERROR,定义于ch.qos.logback.classic.Level类
                %thread 打印日志所属线程号
                %logger{36} 表示logger名字最长36个字符,否则按照句点分割。
                    可以做以下选择
                    %logger	    mainPackage.sub.sample.Bar	mainPackage.sub.sample.Bar  (完整输出)
                    %logger{0}	mainPackage.sub.sample.Bar	Bar     (类全写)
                    %logger{5}	mainPackage.sub.sample.Bar	m.s.s.Bar   (类全写(不占长度),(长度足够包略写的长度)包略写,有多余的长度满足最后一个包的长度,可以依次往前全写)
                    %logger{10}	mainPackage.sub.sample.Bar	m.s.s.Bar
                    %logger{15}	mainPackage.sub.sample.Bar	m.s.sample.Bar
                    %logger{16}	mainPackage.sub.sample.Bar	m.sub.sample.Bar
                    %logger{26}	mainPackage.sub.sample.Bar	mainPackage.sub.sample.Bar
                  %method:所在方法名(注意:比较影响执行效率,建议不用或者提升日志级别再使用)
                 [%file : %line] 哪个文件,哪一行的日志(注意:line比较影响执行效率,建议不用或者提升日志级别再使用)
                 %msg%n 其中msg表示打印输出的消息, %n表示换行
            -->
            <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
            </pattern>
        </encoder>
    </appender>

    <!--
        root节点,必选节点,用来指定最基础的日志输出级别,他有俩个自己点可以用来应用appender,格式化日志输出

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

    <!--
        logger节点,可选节点,用来具体指明包的日志输出级别,它将会覆盖root的输出级别,即root是全局设置所有java程序输出的日志级别,而logger是局部设置某个包下面的java程序的输入日志级别
    -->
    <!--<logger name="com.example.logback" level="warn" />-->

</configuration>

🍓应用

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    private final Logger logger = LoggerFactory.getLogger(UserController.class);

    @RequestMapping(value = "queryUser")
    public String queryUser(){
        logger.debug("logger_debug");
        logger.info("logger_info");
        logger.warn("logger_warn");
        logger.error("logger_error");
        return "success";
    }
}

🍓日志


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::               (v2.5.11)

16:11:49.335 logback [main] INFO  cn.com.xuhx.App.logStarting [StartupInfoLogger.java : 55] - Starting App using Java 1.8.0_144 on LAPTOP-LD912GOF with PID 7060 (E:\ideaProject\SpringStudy\spring-logback\target\classes started by 15727 in E:\ideaProject\SpringStudy)
16:11:49.337 logback [main] INFO  cn.com.xuhx.App.logStartupProfileInfo [SpringApplication.java : 675] - No active profile set, falling back to 1 default profile: "default"
16:11:49.879 logback [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer.initialize [TomcatWebServer.java : 108] - Tomcat initialized with port(s): 8080 (http)
16:11:49.884 logback [main] INFO  o.a.coyote.http11.Http11NioProtocol.log [DirectJDKLog.java : 173] - Initializing ProtocolHandler ["http-nio-8080"]
16:11:49.885 logback [main] INFO  o.a.catalina.core.StandardService.log [DirectJDKLog.java : 173] - Starting service [Tomcat]
16:11:49.885 logback [main] INFO  o.a.catalina.core.StandardEngine.log [DirectJDKLog.java : 173] - Starting Servlet engine: [Apache Tomcat/9.0.60]
16:11:49.974 logback [main] INFO  o.a.c.c.C.[Tomcat].[localhost].[/].log [DirectJDKLog.java : 173] - Initializing Spring embedded WebApplicationContext
16:11:49.974 logback [main] INFO  o.s.b.w.s.c.ServletWebServerApplicationContext.prepareWebApplicationContext [ServletWebServerApplicationContext.java : 290] - Root WebApplicationContext: initialization completed in 605 ms
16:11:50.164 logback [main] INFO  o.a.coyote.http11.Http11NioProtocol.log [DirectJDKLog.java : 173] - Starting ProtocolHandler ["http-nio-8080"]
16:11:50.176 logback [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer.start [TomcatWebServer.java : 220] - Tomcat started on port(s): 8080 (http) with context path ''
16:11:50.193 logback [main] INFO  cn.com.xuhx.App.logStarted [StartupInfoLogger.java : 61] - Started App in 1.132 seconds (JVM running for 1.89)
16:12:08.063 logback [http-nio-8080-exec-1] INFO  o.a.tomcat.util.http.parser.Cookie.log [DirectJDKLog.java : 173] - A cookie header was received [Hm_lvt_8acef669ea66f479854ecd328d1f348f=1651450539,1651914390] that contained an invalid cookie. That cookie will be ignored.
 Note: further occurrences of this error will be logged at DEBUG level.
16:12:08.067 logback [http-nio-8080-exec-1] INFO  o.a.c.c.C.[Tomcat].[localhost].[/].log [DirectJDKLog.java : 173] - Initializing Spring DispatcherServlet 'dispatcherServlet'
16:12:08.067 logback [http-nio-8080-exec-1] INFO  o.s.web.servlet.DispatcherServlet.initServletBean [FrameworkServlet.java : 525] - Initializing Servlet 'dispatcherServlet'
16:12:08.068 logback [http-nio-8080-exec-1] INFO  o.s.web.servlet.DispatcherServlet.initServletBean [FrameworkServlet.java : 547] - Completed initialization in 1 ms
16:12:08.081 logback [http-nio-8080-exec-1] INFO  c.c.x.user.controller.UserController.queryUser [UserController.java : 17] - logger_info
16:12:08.081 logback [http-nio-8080-exec-1] WARN  c.c.x.user.controller.UserController.queryUser [UserController.java : 18] - logger_warn
16:12:08.081 logback [http-nio-8080-exec-1] ERROR c.c.x.user.controller.UserController.queryUser [UserController.java : 19] - logger_error

🍓SpringBoot文件的加载顺序

logback.xml application.propertiesapplication.ymllogback-spring.xml
注意: 如果你想在application.properties里面配置logback日志文件的输出目录,则必须使用logback-spring.xml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值