目录
1:SpringBoot日志
SpringBoot日志分为日志门面和日志实现
日志门面:就是相当于jdbc连接数据库,是日志的使用方式。
日志实现:相当于导入mysql和oracle的jar包,导入那个日志实现包,就用该日志包实现日志。
市场上存在非常多的日志框架,分为日志门面(日志的抽象层)和日志实现。 可以这样理解:日志门面相当于是接口,日志实现相当于是接口的实现类。
总结:
默认情况下,SpringBoot使用了slf4j+logback这样的日志门面和日志实现的组合,所以我们这边不对日志框架进行修改,直接在原有的日志基础上进行配置。
我们在引入spring-boot-starter-web依赖时,已经包含了 spring-boot-starter-logging这个日志依赖。所以我们无需在引入spring-boot-starter-logging依赖
2:项目启动日志验证
启动springboot项目查看启动日志:
使用终端:jsp命令查看 java进程id跟输出日志吻合
3:springboot日志级别
4:日志输出和级别控制
1:代码控制 Logger logger=LoggerFactory.getLogger(LogController1.class);
package org.example.springboot_1_web1.logController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LogController1 {
//第一种方法:使用传统的LoggerFactory获取日志对象
Logger logger=LoggerFactory.getLogger(LogController1.class);
@GetMapping(value = "log1")
public String log1(){
logger.debug("debug");
logger.info("LogController1输出log1方法的info日志");
logger.error("error");
return "log";
}
}
2:注解 @Slf4j
package org.example.springboot_1_web1.logController;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class LogController2 {
//第二种方法:使用@Slf4j注解
@GetMapping(value = "log2")
public String log2(String a,String b){
log.trace("trace");
log.debug("debug");
//spring的日志级别默认是info、只会打印info、warn、error日志
//可以设置 日志级别 logging.level.root=debug,就会打印debug的日志了
log.info("info 参数a:{} b:{}",a,b);//占位符 获取a b
log.warn("warn");
log.error("error");
return "log2";
}
}
3:日志级别配置
#控制台输出格式 默认值
logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
#外部文件输出格式 默认值
logging.pattern.file=%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS
#默认所有的日志级别设置
logging.level.root=info
#精确调整某一些包下的日志级别,比如LogController1是debug LogController2是info
#这样控制力度更细
logging.level.org.example.springboot_1_web1.logController.LogController1=debug
logging.level.org.example.springboot_1_web1.logController.LogController2=info
#分组控制日志级别 一次调整一组
logging.group.aa=org.example.springboot_1_web1.controller1,org.example.springboot_1_web1.controller
logging.level.aa=info
#控制sql的日志级别web的日志级别
logging.level.sql=debug
logging.level.web=debug
5:LogBack内部日志文件输出
#指定外部日志文件名字
#只有文件名字demo.log 就是项目目录
#路径+文件名字 就是路径生成
logging.file.name=/Users/huyiju/Desktop/SpringBoot/SpringbootWeb1_Log/SpringWeb1.log
#配置日志滚动策略 按照文件名字+年月日+日志切割编号.gz SpringWeb1.log.2024-08-02.0.gz
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
#超过1MB新建一个文件
logging.logback.rollingpolicy.max-file-size=1MB
#日志总文件超过1GB 删除
logging.logback.rollingpolicy.total-size-cap=1GB
#日志总文件超过7天 删除
logging.logback.rollingpolicy.max-history=7
测试:通过修改系统日期和不断发送数据让日志变大,可以看到日志归档和分割情况
6:自定义日志外部输出
想要做到日志自定义外部输出,可以使logBack,Log4J等,就需要配置外部文件
6.1:logBack外部日志输出
配置一个新的logback-spring.xml 配置文件,内容网上找一下就行了
<?xml version="1.0" encoding="UTF-8"?>
<!-- logback默认每60秒扫描该文件一次,如果有变动则用变动后的配置文件。 -->
<configuration scan="false">
<!-- ==============================================开发环境=========================================== -->
<springProfile name="dev">
<!-- 控制台输出 -->
<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{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</springProfile>
<!-- ==============================================生产环境=========================================== -->
<springProfile name="pro">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 ./log /Users/huyiju/Desktop/SpringBoot/SpringbootWeb1_Log/prod-->
<property name="LOG_HOME" value="./log"/>
<!-- 控制台输出 -->
<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{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="INFO_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<file>${LOG_HOME}/info.log</file>
<!--滚动策略,按照大小时间滚动 SizeAndTimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--只保留最近30天的日志-->
<MaxHistory>30</MaxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
<MaxFileSize>10MB</MaxFileSize>
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
<!--过滤器,只有过滤到指定级别的日志信息才会输出,如果level为ERROR,那么控制台只会输出ERROR日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="ERROR_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<file>${LOG_HOME}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
<MaxFileSize>10MB</MaxFileSize>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!--指定最基础的日志输出级别-->
<root level="INFO">
<!--appender将会添加到这个loger-->
<appender-ref ref="STDOUT"/>
<appender-ref ref="INFO_APPENDER"/>
<appender-ref ref="ERROR_APPENDER"/>
</root>
</springProfile>
</configuration>
6.2:log4J2内部日志输出
1:pom文件导入log4j的jar。
<!-- SpringBoot Web依赖 包含spring的jar spring-web的jar tomcat的jar-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<!-- 排除Spring Boot默认使用的日志依赖 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 使用log4j2 日志输出-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2:在配置文件中的日志门面不需要更改,只是改了后端的依赖
#指定外部日志文件名字
#只有文件名字demo.log 就是项目目录
#路径+文件名字 就是路径生成 (./log/springWeb1.log,项目目录下生成)
logging.file.name=/Users/huyiju/Desktop/SpringBoot/SpringbootWeb1_Log/SpringWeb_Log4J.log
3:测试结果验证
6.3:log4J2外部日志输出
1:导入jar
2:在配置文件中引入外部的log4j.xml配置
logging.config=classpath:log4j2.xml
3:编写log4j2.xml内容,设置日志输出地址,滚动规则等
<?xml version="1.0" encoding="UTF-8"?>
<!--status:Log4j2内部日志的输出级别,设置为TRACE对学习Log4j2非常有用 -->
<!--monitorInterval:定时检测配置文件的修改,有变化则自动重新加载配置,时间单位为秒,最小间隔为5s -->
<Configuration status="WARN" monitorInterval="1800">
<!--properties:设置全局变量 -->
<properties>
<!--LOG_HOME:指定当前日志存放的目录 -->
<property name="LOG_HOME">./log4s</property>
<!--FILE_NAME:指定日志文件的名称 -->
<property name="FILE_NAME">test</property>
</properties>
<!--Appenders:定义日志输出目的地,内容和格式等 -->
<Appenders>
<!--Console:日志输出到控制台标准输出 -->
<Console name="Console" target="SYSTEM_OUT">
<!--pattern:日期,线程名,日志级别,日志名称,日志信息,换行 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [线程名%t] [日志级别%-5level] [日志名称%L] - [日志信息:%msg]%n" />
</Console>
<!--RollingFile:日志输出到文件,下面的文件都使用相对路径 -->
<!--fileName:当前日志输出的文件名称 -->
<!--filePattern:备份日志文件名称,备份目录为logs下面以年月命名的目录,备份时使用gz格式压缩 -->
<RollingFile name="RollingFile" fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%L] - %msg%n" />
<!--Policies:触发策略决定何时执行备份 -->
<Policies>
<!--TimeBasedTriggeringPolicy:日志文件按照时间备份 -->
<!--interval:每1天生成一个新文件,时间单位需要结合filePattern时间%d{yyyy-MM-dd} -->
<!--同理,如果要每1小时生成一个新文件,则改成%d{yyyy-MM-ddHH} -->
<!--modulate:对备份日志的生成时间纠偏,纠偏以0为基准进行,"0+interval"决定启动后第一次备份时间 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<!--SizeBasedTriggeringPolicy:日志文件按照大小备份 -->
<!--size:指定日志文件最大为100MB,单位可以为KB、MB或GB -->
<SizeBasedTriggeringPolicy size="200MB" />
</Policies>
<!--DefaultRolloverStrategy:翻转策略决定如何执行备份 -->
<!--max:最多保存5个备份文件,结合时间使用后,在每个时间段内最多有5个备份,多出来的会被覆盖 -->
<!--compressionLevel:配置日志压缩级别,范围0-9,0不压缩,1压缩速度最快,9压缩率最好,目前只对于zip压缩文件类型有效 -->
<DefaultRolloverStrategy max="5" compressionLevel="1">
<!--Delete:删除匹配到的过期备份文件 -->
<!--maxDepth:由于备份文件保存在${LOG_HOME}/$${date:yyyy-MM},所以目录深度设置为2 -->
<Delete basePath="${LOG_HOME}" maxDepth="2">
<!--IfFileName:匹配文件名称 -->
<!--glob:匹配2级目录深度下的以.log.gz结尾的备份文件 -->
<IfFileName glob="*/*.log.gz" />
<!--IfLastModified:匹配文件修改时间 -->
<!--age:匹配超过180天的文件,单位D、H、M、S分别表示天、小时、分钟、秒-->
<IfLastModified age="180D" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<!--Loggers:定义日志级别和使用的Appenders -->
<Loggers>
<!--name: 打印日志的类的包路径 -->
<!--additivity: true当前的Logger打印的日志附加到Root,false仅仅打印到RollingFile -->
<Logger name="com.example" level="info" additivity="true">
<AppenderRef ref="RollingFile" />
</Logger>
<!--Root:日志默认打印到控制台 -->
<!--level日志级别: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF -->
<Root level="INFO">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>