6、springboot:日志的介绍、使用、切换

一、主流的日志框架介绍

 

 

二、springboot中SLF4J的使用

如何在系统中使用SLF4j https://www.slf4j.org

以后开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法;

 如下图:

每一个日志的实现框架都有自己的配置文件。

使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文件

 

三、springboot如何使其它日志框架转为slf4j进行输出

springboot使用(slf4j+logback)、 Spring使用(commons-logging)、Hibernate使用(jboss-logging)、MyBatis、xxxx
springboot进行统一日志记录,即使是别的框架和我一起统一使用slf4j进行输出

如何让系统中所有的日志都统一到slf4j;
  1、将系统中其他日志框架先排除出去;
  2、用中间包来替换原有的日志框架;
  3、导入slf4j其他的实现

 

 四、springboot日志关系

 依赖:

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

 SpringBoot使用它来做日志功能:

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

 SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,

引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可

 

五、springboot中日志的相关配置

  1、springboot中的默认日志相关配置

  如下示例是 springboot 中日志框架使用的一个单元测试,通过这个测试查看默认的日志配置
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootLogTest {
  //记录器 Logger logger
= LoggerFactory.getLogger(getClass()); @Test public void logTest() { logger.trace("这是trace日志"); logger.debug("这是debug日志"); logger.info("这是info日志"); //springboot 默认设置的 info级别 logger.warn("这是warn日志"); logger.error("这是error日志"); } }

日志的级别由低到高

trace<debug<info<warn<error

 运行springboot应用的时候查看控制台可以发现;springboot日志输出级别默认是info级别(只输出>=info的级别的的日志信息)

可以调整输出的日志级别,只输出>=日志级别的日志信息

另外默认把日志信息是输出到控制台

 

  2.application.xml中配置日志级别

logging.level.com.mr=debug
//指定扫描的包(红色备注)以及日志级别

 

  3.配置日志输出文件(不配置时默认只输出到控制台)

    方式一:

#没有指定具体路径的时候日志文件就生成在当前项目下
logging.file.name=springboot.log
#指定了具体路径的时候日志文件就生成在指定路径下
#logging.file.name=e:/springboot.log

 

    方式二:

#在当前项目的磁盘(我的项目现在在D盘)的根路径创建spring文件和和里面的log文件,使用spring.Log作为默认文件
logging.file.path=/spring/log

 

当配置了logging.file.name时logging.file.path就会失效

  4.自定义日志信息输出格式

#在控制台输出的日志格式
logging.pattern.console = 
#指定在文件中日志输出的格式 
logging.pattern.file =
复制代码
日志输出格式:
                %d表示日期时间,
                %thread表示线程名,
                %-5level:级别从左显示5个字符宽度
                %logger{50} 表示logger名字最长50个字符,否则按照句点分割。
                %msg:日志消息,
                %n是换行符
    -->
    %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
复制代码

举例:

 

输出结果:

 

配置代码小结

#设置日志级别
logging.level.com.atguigu=trace

#配置日志文件:
#       方式一:
#没有指定具体路径的时候日志文件就生成在当前项目下
#logging.file.name=springboot.log
#指定了具体路径的时候日志文件就生成在指定路径下
#logging.file.name=e:/springboot.log

#       方式二:
#在当前项目的磁盘的根目录下创建spring文件夹,再在里面创建log文件夹;最后使用spring.log作为默认日志文件名
logging.file.path=/spring/log

#当配置了logging.file.name时logging.file.path就会失效

#配置控制台日志输出格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n

#配置文件中日志输出格式
logging.pattern.file=%d{yyyy-MM-dd} ==== [%thread] === %-5level %logger{50} - %msg%n

 

六、自定义日志配置文件(不使用springboot的默认日志配置) 

  只要在类路径下放上每个日志框架自己的配置文件;SpringBoot就不使用它的默认配置了
  使用什么日志则配置什么文件以及注意文件名
  各日志的文件配置名如下:

 

  以自定义logback日志的配置为例:(在类路径下放名为logback.xml的文件):

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="/app/log" />
    <!-- 定义日志的文件名 -->
    <property name="appName" value="loog"/>
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
复制代码

 

 

如果文件名为logback.xml:就会被日志框架直接识别了;
名字为logback-spring.xml时:日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,
               可以使用SpringBoot的高级Profile功能

 

<springProfile name="xxx">
    <!--可以指定某段配置只在某个环境下生效--> 
</springProfile>

  此时修改logback.xml名为logback-spring.xml

 

  <springProfile name="xxx">指定某段配置根据环境不同而配置的内容不同
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="/app/log" />
    <!-- 定义日志的文件名 -->
    <property name="appName" value="loog"/>
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <springProfile name="dev">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} +++ [%thread] %-5level %logger{50} - %msg%n</pattern>
            </springProfile>
            <springProfile name="!dev">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} --- [%thread] %-5level %logger{50} - %msg%n</pattern>
            </springProfile>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
复制代码
 

  指定环境: 

如果使用名字为logback.xml作为日志配置文件,还要使用profile功能,会报错

 推荐使用spring-logbac.xml 是由Spring Boot识别,可以使用新功能

 

七、切换日志框架

可以按照slf4j的日志适配图,进行相关的切换;

  1、切换为log4j的配置(记得写相关配置文件)

    ①假如现在想用 log4j ,需要排除 springboot 默认依赖的 logback 依赖;

    ②log4j-over-slf4j.jar 是 log4j 转成 slf4j 要用的,而我们现在就是想用 log4j,不想转为slf4j,所以不需要这个转换包,即排除这个依赖,

    ③slf4j-log4j12.jar 是 log4j 要用的中间包,需导入。

复制代码<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
<exclusions> <exclusion> <artifactId>logback-classic</artifactId> <groupId>ch.qos.logback</groupId> </exclusion> <exclusion> <artifactId>log4j-over-slf4j</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions>
</dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency>
复制代码

   2、切换为log4j2日志框架(记得写相关配置文件)

复制代码
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-logging</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
</dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
复制代码
posted @ 2020-03-14 20:10  Arbitrary233  阅读(409)  评论(0编辑  收藏  举报