SpringBoot默认的日志管理logback

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章