SpringBoot 之日志框架

文章目录

  • 日志框架简述
  • SLF4J 原理
  • SpringBoot 日志使用
    • Spring Boot 指定 Logback 日志配置文件
  • logback 配置文件解析

日志框架简述

1、市面上的日志框架:JUL、JCL(Apache 基金会的)、Jboss-logging、logback、log4j、log4j2、slf4j…

日志门面(抽象层) 日志实现
JCL(Jakarta Commons Logging-属于Apache基金会)、jboss-logging JUL(java.util.logging-Java JDK自带的)
SLF4j(Simple Logging Facade for Java) Log4j 、 Log4j2 、Logback

2、其中 SLF4j 与 Log4j 、 Logback 出自同一人之手。Log4j2 是另外一个人并不是 Log4j 的升级版,只是借用了 Log4j 的名号而已,Logback 才是 Log4j 的升级版。

SLF4J 原理

SLF4J Github 开源地址:https://github.com/qos-ch/slf4j
SLF4J 使用文档地址:https://www.slf4j.org/manual.html

SpringBoot 日志使用

1、SpringBoot 默认使用 SLF4j 和 Logback 记录日志。

  • 日志门面:SLF4j(Simple Logging Facade for Java)
  • 日志实现:Log4j、Log4j2、Logback

2、开发的时候,为了应用日志系统的将来的扩展,日志记录方法的调用,不应该直接调用日志的实现类,而是调用日志抽象层里面的方法;这样以后即使更换了实现类也没有关系。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}
//////////////////////////////////////////////////
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class HelloWolrd {
    public static void main(String[] args) {
        // 日志的级别
        // 由低到高:trace
        // 通过此级别关系,我们可以通过调整日志的级别:日志就只会在这个级别以及以后的更高级别才生效。
        log.trace("this is trace log...");
        log.debug("this is debug log...");
        log.info("this is info log...");
        log.warn("this is warn log...");
        log.error("this is error log...");
    }
}

spring-boot中底层依赖:

<dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starterartifactId>
      <version>2.1.4.RELEASEversion>
      <scope>compilescope>
dependency>

<dependency>
	  <groupId>org.springframework.bootgroupId>
	  <artifactId>spring-boot-starter-loggingartifactId>
	  <version>2.1.4.RELEASEversion>
	  <scope>compilescope>
dependency>

SpringBoot修改日志的默认配置:

logging.level=info

# 日志文件名
#logging.file=./springboot.log

# 在控制台输出的日志的格式
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

Spring Boot 指定 Logback 日志配置文件

1、logback.xml:应用启动时会直接被日志框架 logback 识别而被使用,不经过Spring Boot,所以使用 logback.xml 作为日志配置文件,不能使用Spring Boot 的 Profile 高级功能。
2、logback-spring.xml:logback 日志框架就不能直接识别到,而会由 Spring Boot 解析此日志配置文件,从而可以使用Spring Boot 的 Profile 高级功能。






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

    <contextName>logbackcontextName>

    
    
    <property name="log.path" value="./" />
    <property name="info.fileName" value="info" />
    <property name="debug.fileName" value="debug" />
    <property name="warn.fileName" value="warn" />
    <property name="error.fileName" value="error" />

    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debuglevel>
        filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            
            <charset>UTF-8charset>
        encoder>
    appender>


    

    
    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <file>${log.path}/${info.fileName}.logfile>
        
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <charset>UTF-8charset>
        encoder>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${log.path}/${info.fileName}-%d{yyyy-MM-dd}.%i.logfileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MBmaxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>
            
            <maxHistory>90maxHistory>
        rollingPolicy>
    appender>

    
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${debug.fileName}.logfile>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <charset>UTF-8charset>
        encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/debug/${debug.fileName}-%d{yyyy-MM-dd}.%i.logfileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MBmaxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>15maxHistory>
        rollingPolicy>
        
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debuglevel>
            
            <onMatch>ACCEPTonMatch>
            
            <onMismatch>DENYonMismatch>
        filter>
    appender>

    
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${warn.fileName}.logfile>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <charset>UTF-8charset>
        encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/warn/${warn.fileName}-%d{yyyy-MM-dd}.%i.logfileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MBmaxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>15maxHistory>
        rollingPolicy>
        
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warnlevel>
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>
    appender>


    
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${error.fileName}.logfile>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <charset>UTF-8charset>
        encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/${error.fileName}-%d{yyyy-MM-dd}.%i.logfileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MBmaxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>15maxHistory>
        rollingPolicy>
        
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERRORlevel>
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>
    appender>

    <appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/request.logfile>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <charset>UTF-8charset>
        encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/request-%d{yyyy-MM-dd}.%i.logfileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MBmaxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>90maxHistory>
        rollingPolicy>
    appender>

    
    <logger name="com.example.springbootprofile.controller" level="info">
        <appender-ref ref="REQUEST"/>
    logger>

    
    <logger name="com.example.mapper" level="debug"/>


    
    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE_ALL"/>
        <appender-ref ref="DEBUG_FILE"/>
        <appender-ref ref="WARN_FILE"/>
        <appender-ref ref="ERROR_FILE"/>
    root>

    
    <springProfile name="dev">
        <root level="info">
            <appender-ref ref="CONSOLE"/>
        root>
    springProfile>

    
    <springProfile name="prd">
        <root level="info">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE_ALL"/>
            <appender-ref ref="DEBUG_FILE"/>
            <appender-ref ref="WARN_FILE"/>
            <appender-ref ref="ERROR_FILE"/>
        root>
    springProfile>

configuration>

logback 配置文件解析

一、configuration 根节点

属性:
// scan : 配置文件如果发生改变,将会重新加载,默认值为true;
// scanPeriod : 检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位时毫秒,当scan为true时,这个属性生效,默认时间间隔为1min。
// debug : 默认为false ,设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。
<configuration scan="true" scanPeriod="2" debug="true">
	
configuration>

基本结构:
多个 appender 元素,零个或多个 logger 元素,最多一个 root 元素。
SpringBoot 之日志框架_第1张图片
二、appender 子节点
负责写日志的组件。
基本结构:
SpringBoot 之日志框架_第2张图片
属性:
name:appender 名称;
class:指定 appender 的全限定名;

 
<configuration debug="true" scan="true" scanPeriod="2">
    
    <appender name="console_out" class="ch.qos.logback.core.ConsoleAppender">
    appender>

    
    <appender name="file_out" class="ch.qos.logback.core.FileAppender">
    appender>
    
    
    <appender name="file_out" class="ch.qos.logback.core.RollingFileAppender">
    appender>

    <root>root>
    <loger>loger>
configuration>

三、ConsoleAppender 日志输出到控制台
以下节点:
encoder : 对日志进行格式化。
target : 字符串System.out 或者 System.err, 默认 System.out;


<configuration>
    
  <appender name="console_out" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
        encoder>
  appender>

  <root level="INFO">             
    <appender-ref ref="console_out" />   
  root>     
configuration>

四、FileAppender 日志添加到文件
有如下节点:
file : 被写入的文件名,可以是相对目录 , 也可以是绝对目录 , 如果目录不存在则会自动创建
append : 如果是true , 日志被追加到文件结尾 , 如果是false,清空现存文件 , 默认是true
encoder : 对日志进行格式化 [具体的转换符说明请参见官网.]
prodent : 如果是true,日志会被安全的写入文件 , 即使其他的FileAppender也会向此文件做写入操作 , 默认是false


<configuration>
    
    <appender name="file_out" class="ch.qos.logback.core.FileAppender">
        <file>logs/debug.logfile>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
        encoder>
    appender>
configuration>

参考:
logback节点配置详解
【Spring Boot】4.日志
logback介绍和配置详解
Logback配置使用

你可能感兴趣的:(#,SpringBoot)