SpringBoot默认的日志管理logback

2023-11-03

1.SpringBoot使用的默认日志框架是Logback,并用INFO级别输出到控制台:

         日志输出内容元素具体如下:

                   时间日期:精确到毫秒

                   日志级别:ERROR,WARN,INFO,DEBUG,TRACE

                   进程ID

                   分隔符:--标识实际日志的开始

                   线程名:方括号括起来(可能会阶段控制台输出)

                   Logger名:通常使用源代码的类名

                   日志内容

         日志依赖:该依赖内容就是SpringBoot默认的日志框架logback,不需要另外导入,已经默认导入了。

<dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-logging</artifactId>

</dependency>

日志级别(从低到高):

TRACE < DEBUG < INFO < WARN < ERROR < ALL < OFF

如果设置为WARN,那么低于WARN的信息都不会输出

以下配置需要在application.properties文件中设置

##root日志以WARN级别输出

logging.level.root=WARN(让日志只输出warn及以上级别的信息)

 

##springframework.web 日志以DEBUG级别输出

logging.level.org.springframework.web=DEBUG

 

##hibernate 日志以ERROR级别输出

logging.level.org.hibernate=ERROR

 

默认情况下,SpringBoot将日志输出到控制台,不会写到日志文件中。如果要编写除控制台输出之外的日志文件,则需要application.properties中设置logging.file 或者logging.path属性

logging.file=log/my.log(相对)或logging.file=/log/my.log(绝对)

logging.path设置目录,会在该目录下创建spring.log文件,并写入日志内容,如logging.path=/var/log

 

如果只配置logging.file, 会在项目的当前路径下生成一个xxx.log日志文件。

如果只配置logging.path, 会在/var/log文件夹下生成日志文件spring.log

注意:二者不可同时使用,若同时使用,则只有logging.file生效

默认情况下,日志文件的大小达到10MB时,会切分一次,产生新的日志文件,默认级别为:ERROR, WARN, INFO

logging.level.root=WARN

logging.level.org.springframework.web=DEBUG

logging.file=d:/log/info.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

 

2. 自定义日志配置

可以使用其他系统对日志进行配置

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

    <!-- scan表示当配置文件发生变化时,会进行重新加载 -->

    <configuration scan="true" scanPeriod="60 seconds" debug="false">

       <contextName>logback</contextName>

       <property name="log.path" value="d:/log/info.log" />

       <!-- 输出到控制台 -->

       <appender name="console" class="ch.qos.logback.core.ConsoleAppender">

           <encoder>

              <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>

           </encoder>

       </appender>

       <!-- 输出到文件 -->  

       <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> 

           <file>${log.path}</file> 

           <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingFileAppender">

               <!-- 日志切分方式,每一天的日志归并到同一天 -->

               <fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern>

           </rollingPolicy>

           <encoder> 

             <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> 

           </encoder> 

       </appender>

       <root level="info">

           <appender-ref ref="console" />

           <appender-ref ref="file" />

       </root>

      

       <!-- logbackjava中的包 -->

       <logger name="cn.huangwei.controller" />

       <!-- additivity是否向上级logger传递打印信息 -->

        <logger name=" cn.huangwei.controller.SpringTestController" level="WARN" additivity="false">

            <appender-ref ref="console"/>

        </logger>

  </configuration>

scan:配置文件如果发生变化,将会重新加载,默认值为true;

scanPeriod:设置检测配置文件的时间间隔,默认单位毫秒,默认间隔1分钟。

debug:设置为true时,将打印出logback内部日志信息。默认为false

contextName标签:一旦设置不能更改,可以通过%contextName来获取上下文名称

 

logger的使用:

<root level="info">

            <appender-ref ref="console" />

            <appender-ref ref="file" />

        </root>

<!-- logbackjava中的包 -->

          <logger name="cn.huangwei.controller" />

          <!-- additivity是否向上级logger传递打印信息 -->

           <logger name="cn.huangwei.controller.SpringTestController" level="WARN" additivity="false">

            <appender-ref ref="console"/>

        </logger>

第一个logger只指定了包名,这样控制了这个包下面的所有文件的日志的打印。这里的打印级别没有单独设置,故默认与上一级别一致,即root中的info级别,而root中的可以向console和file输出日志信息,默认为console输出。

例如新建一个TestController

package cn.huangwei.controller;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

@Controller

public class TestController {

   

    private Logger logger = LoggerFactory.getLogger(this.getClass());

   

    @RequestMapping("/show")

    @ResponseBody

    public String show() {

       logger.debug("debug日志");

       logger.info("info日志");

       logger.warn("warn日志");

       logger.error("error日志");

       return "show";

    }

}

该文件是在cn.huangwei.controller包下面的文件,没有设置level,故使用root上级的日志级别,没有设置additity,故默认为true,向上传递。故遵循上一级root的日志输出方式,输出info及info以上级别的日志,默认输出控制台上。

运行项目,在地址栏输入localhost:8080/show,查看控制台的日志输出

<!-- additivity是否向上级logger传递打印信息 -->

           <logger name="cn.huangwei.controller.SpringTestController" level="WARN" additivity="false">

            <appender-ref ref="console"/>

        </logger>

第二个logger,对于SpringTestController文件,打印warn及warn级别以上的日志,additivity为false表示不向上级传递日志信息,它的继承关系为cn.huangwei.controller.SpringTestController的上一级为cn.huangwei.controllercn.huangwei.controller的上一级为root自身通过console打印日志信息

修改SpringTestController类;所以当SpringTestController接收到日志消息时,自身进行打印,上级cn.huangwei.controller的logger没有收到消息,就不需要向上传递,故只打印一份日志。

运行之后得到结果

如果将additivity设置为true,需要向上级传递,由上级来执行日志信息;结果为

分析:SpringTestController的上一级是cn.huangwei.controller,cn.huangwei.controller的上一级是root,当SpringTestController收到日志消息时,自身通过appender打印消息,然后向上级cn.huangwei.controller传递,由于该logger没有level,没有additity,没有appender,就委托给它上级root打印日志消息,因此日志消息打印第二遍。

问:logger的继承关系(上下级)怎么判断?

是根据logger的name属性中“.”点号分隔符进行判断的,例如cn.huangwei是cn.huangwei.controller的上级,如果没有点号例如huangwei,那么他的上级是root。

<!-- logger,第一级 -->

       <root level="info">

           <appender-ref ref="console" />

           <appender-ref ref="file" />

       </root>

      

       <!-- loggerjava中的包下日志管理,additivity默认为true -->

       <logger name="cn.huangwei.controller" level="debug"/>

       <!-- additivity是否向上级logger传递打印信息 -->

       <logger name="cn.huangwei" level="warn" additivity="false">

            <appender-ref ref="console"/>

        </logger>

日志输出结果为:

问:继承关系中的上下级日志等级问题?

如果日志消息对应的logger有level属性,按照level属性来,如果没有,按照上级的level属性来,如果连root都没有,默认debug。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot默认的日志管理logback 的相关文章

随机推荐

  • NameNode: Permission denied&无法启动Hadoop解决方法

    NameNode Permission denied publickey gssapi keyex gssapi with mic password 就是这个原因 这个问题的出现主要是因为没有给authorized keys授权 解决方法如
  • VMware虚拟机安装MacOS Big Sur

    之前完善了vm安装Windows系统的教程 今天给大家分享一个vm安装MacOS的教程 我们今天用macOS Big Sur版本来做教程演示 注 使用VMware安装MacOS哪怕配置给的高也会出现体验上的不佳 大家可以尽可能调高适当的配置
  • ElasticSearch 双数据中心建设在新网银行的实践

    本文公众号读者飞熊的投稿 本文主要讲述了ElasticSearch 双数据中心建设在新网银行的实践 作者简介 飞熊 目前就职于新网银行大数据中心 主要从事大数据实时计算和平台开发相关工作 对Flink Spark 以及ElasticSear
  • goland语法面试题

    文章目录 1 关于 switch 语句 下面说法正确的是 2 下面代码能编译通过吗 可以的话 输出什么 3 interface 是可以指向任意对象的 Any 类型 是否正确 4 下面的代码有什么问题 1 关于 switch 语句 下面说法正
  • Unity5热更新ILRuntime 使用 Protobuf3.0

    Unity5热更新ILRuntime 使用 Protobuf3 0 须知 1 pb3官方用到了C 很多的新语法 所以在unity主工程中直接撸码是不可以的 还好github上面有同僚作了framework35版的 2 ILrt中的类目前是不
  • R语言与面向对象的编程(3):R6类

    专注系列化 高质量的R语言教程 本号已支持快捷转载 无需白名单即可转载 本系列将介绍R语言中三个与面向对象的编程 Object Oriented Programming OOP 相关的工具包 proto R6和基础包methods 这是一个
  • python中,@和-> 代表什么?

    今天把代码放到Hadoop平台时调试代码的时候报错 但是在本地测试并没有什么问题 然后可查看了下代码 报错的地方这么定义的 看到这个符号觉得很奇怪 因为在Python中确实没见过这个符号 后来查了一下 参考这个博主写的 https blog
  • noip2008 火柴棒等式 (暴力枚举)

    P1496火柴棒等式 Accepted 标签 搜索 NOIP提高组2008 描述 给你n根火柴棍 你可以拼出多少个形如 A B C 的等式 等式中的A B C是用火柴棍拼出的整数 若该数非零 则最高位不能是0 用火柴棍拼数字0 9的拼法如图
  • 算法基础\BFS\DFS

    1 200 岛屿数量 题目描述 给你一个由 1 陆地 和 0 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向和 或竖直方向上相邻的陆地连接形成 此外 你可以假设该网格的四条边均被水包围 示例 示
  • 41.cuBLAS开发指南中文版--cuBLAS中的Level-2gemvBatched()

    2 6 24 cublas
  • numpy 三维矩阵下采样小技巧

    问题描述 我们有一个 160 192 224 的三维矩阵 由于其过大 跑神经网络时显存不够 此时我们的一个思路就是对其进行一个简单的下采样 即没3x3x3的小方格里只取其中间的那个数 现在的问题是如何快速高效地实现这个计算 而不是使用多个f
  • 爬虫代理IP池怎么来的,可能遇到哪些问题,怎么解决

    目录 前言 一 代理IP对爬虫工作的重要性 二 代理IP池从哪里来 三 爬虫工作中可能会遇到哪些问题 四 怎么解决遇到的问题 总结 前言 爬虫工作离不开代理IP的支持 代理IP在爬虫工作中发挥重要的作用 但爬虫代理IP池从哪里来呢 爬虫工作
  • 口令破解(概述、暴力破解、字典破解、Hydra)

    文章目录 口令破解 概述 口令安全现状 破解方式 暴力破解 字典破解 Hydra quarkspwdump 口令破解 概述 现在很多地方都以用户名 账号 和口令 密码 作为鉴权的方式 口令 密码 就意味着访问权限 口令 密码 就相当于进入家
  • sata接口_无线网卡M.2(ngff) keyA/E接口扩展sata硬盘接口,黑群辉NAS系统

    miniPC普及 主板小型化后 PCIE接口数量减少到1 2个 甚至没有 sata接口数量也大幅减少 这样的主板对于想使用多硬盘 特别是要黑群辉NAS系统的 是不适合的 好在某些主板有无线网卡M 2 ngff 接口 为扩展sata存留了希望
  • 华为手机助手上架流程_2019年各大安卓应用商店上架经验,含流程,物料,方法,建议收藏...

    注册应用商店账号 申请应用商店上架是APP推广的第一步 这一步没做好 会延迟甚至耽误后续的工作 因此 做好上架工作尤为重要 今天姑婆根据我们自己APP上架的经验进行了整理 分享给大家 希望对大家有所帮助 一 安卓应用商店格局 据调查显示在中
  • 【ubuntu】安装tensorRT

    tensorRT官方安装文档TensorRT3 Installation Guide RC pdf位于tensorRT下载页面 1 tensorRT下载 将tensorRT下载到想要安装的目录 https developer nvidia
  • Java字符串

    文章目录 Java字符串 一 Java常用 API 二 String 类 1 String 类的特点 1 Java 程序中所有双引号字符串 都是 String 类的对象 2 字符串在创建之后 其内容不可更改 3 字符串虽然不可改变 但是可以
  • 在vite+vue3项目下el-image引用本地图片失败

    地址使用 xxx xxxx 绝对路径 地址使用require xx xx 和require xx xx 地址使用相对路径不行 xxx xxx
  • Unity 动态鼠标切换

    Header 获得需要替换的鼠标纹理 SerializeField private Texture2D cursorTexture private void OnMouseEnter 鼠标进入更换鼠标纹理 Cursor SetCursor
  • SpringBoot默认的日志管理logback

    1 SpringBoot使用的默认日志框架是Logback 并用INFO级别输出到控制台 日志输出内容元素具体如下 时间日期 精确到毫秒 日志级别 ERROR WARN INFO DEBUG TRACE 进程ID 分隔符 标识实际日志的开始