SpringBoot_第十章(日志)

目录

1:SpringBoot日志

2:项目启动日志验证

3:springboot日志级别

4:日志输出和级别控制

5:LogBack外部日志文件输出

6:自定义日志外部输出

6.1:logBack外部日志输出

6.2:log4j2内部日志输出

6.3:log4J2外部日志输出


1:SpringBoot日志

SpringBoot日志分为日志门面和日志实现

日志门面:就是相当于jdbc连接数据库,是日志的使用方式。

日志实现:相当于导入mysql和oracle的jar包,导入那个日志实现包,就用该日志包实现日志。

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="prod">
        <!--定义日志文件的存储地址 勿在 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>

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值