springboot2原理实战(19)--日志配置

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: springboot2原理实战(19)--日志配置

目录:


本文主要来了解下springboot2的日志配置

1dc618a0ed9580ce8bfa6facb208c08f.png


一、日志级别


springboot默认使用的日志是logback,日志级别有很多,我们看下这个类LogLevel :


package org.springframework.boot.logging;


/**
 * Logging levels supported by a {@link LoggingSystem}.
 *
 * @author Phillip Webb
 * @since 1.0.0
 */
public enum LogLevel {
  TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
}


可以看到 日志级别有: trace debug info warn error fetal off。日志级别从trace(跟踪)到FATAL(致命)依次级别变高的。off是关闭日志。


了解默认级别:


做个试验,看下springboot默认使用的是哪种级别:

写个类打印日志:


@Component
public class UserService {
    private Logger log  = LoggerFactory.getLogger(this.getClass());
    public void log(){
        log.debug("user service debug log");
        log.info("user service info log");
        log.warn("user service warn log");
        log.error("user service error log");
    }
}


入口函数调用log方法:


@SpringBootApplication
public class Demo19Application {
    public static void main(String[] args) {
//        ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
        ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, args);
        context.getBean(UserDao.class).log();
        System.out.println("=====================================================================");
        context.close();
    }


运行结果如下:


5d4c6812c8535adbb050f4ddf2e1bce8.png

可以看到默认的日志级别是info开始的。


我们一般开发中经常是使用debug级别,生成环境中是从info开始,所以设置下日志级别:


2.设置日志级别为debug


可以通过logging.level.*=DEBUG来设置,可以是包,也可以是某个类


①修改某个类的日志级别


修改application.properties

# root表示所有的类
#logging.level.com.springboot.demo19.dao=Debug


再次运行入口函数:


@SpringBootApplication
public class Demo19Application {
    public static void main(String[] args) {
//        ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
        ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, args);
        context.getBean(UserDao.class).log();
        System.out.println("=====================================================================");
//        context.getBean(UserService.class).log();
        context.close();
    }
}


如下图:userDao的日志级别已经修改成了debug级别:


46a9d80a6e05e4e3b19d57a0ee70bcdf.png

刚才配置文件是指向了类,还可以指向包,也可指向全部使用root。现在演示所有的类的日志级别,都改成debug。


②修改所有的类的日志级别:


修改成root不仅可以打印自己写的类,也可以打印出springboot源码中类的日志。


修改application.properties

# root表示所有的类
logging.level.root=Debug
@Component
public class UserService {
    private Logger log  = LoggerFactory.getLogger(this.getClass());
    public void log(){
        log.debug("user service debug log");
        log.info("user service info log");
        log.warn("user service warn log");
        log.error("user service error log");
    }
}


@Component
public class UserDao {
    private Logger log  = LoggerFactory.getLogger(this.getClass());
    public void log(){
        log.debug("user dao debug log");
        log.info("user dao info log");
        log.warn("user dao warn log");
        log.error("user dao error log");
    }
}


@SpringBootApplication
public class Demo19Application {
    public static void main(String[] args) {
//        ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
        ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, args);
        context.getBean(UserDao.class).log();
        System.out.println("=====================================================================");
        context.getBean(UserService.class).log();
        context.close();
    }
}


运行结果:


1dc618a0ed9580ce8bfa6facb208c08f.png

可以看到全部的类的日志的debug级别的日志开始都打印出来了。

5d4c6812c8535adbb050f4ddf2e1bce8.png

这里如果想要只打印springboot的自己debug的日志,不打印我们的,可以

// ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
打开这行代码
并且去掉application.properties的那行root的配置
@SpringBootApplication
public class Demo19Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
        context.getBean(UserDao.class).log();
        System.out.println("=====================================================================");
        context.getBean(UserService.class).log();
        context.close();
    }
}


可看到,上面的是springboot的debug级别的日志,下面使我们自己写的info日志级别的日志。


2.排除源码的日志


如果想排除springboot源码中某个类的debug的日志,可以在注解上设置


@SpringBootApplication(exclude = WebServicesAutoConfiguration.class)
public class Demo19Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
//        ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, args);
        context.getBean(UserDao.class).log();
        System.out.println("=====================================================================");
        context.getBean(UserService.class).log();
        context.close();
    }
}


这里我们使用@SpringBootApplication(exclude = WebServicesAutoConfiguration.class),排除了这个类的日志,本质上是不自动配置这个类了,头脑要灵活,不能被限制在日志的圈子里。


3.关闭日志输出


关闭其实很简单,可以关闭某个类或者某个包下的日志:

application.properties


logging.level.com.springboot.demo19.dao=OFF
logging.level.com.springboot.demo19.service=DEBUG


看下还有没有userdao的日志:


@SpringBootApplication(exclude = WebServicesAutoConfiguration.class)
public class Demo19Application {
    public static void main(String[] args) {
//        ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
        ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, args);
        context.getBean(UserDao.class).log();
        System.out.println("=====================================================================");
        context.getBean(UserService.class).log();
        context.close();
    }
}


46a9d80a6e05e4e3b19d57a0ee70bcdf.png

46a9d80a6e05e4e3b19d57a0ee70bcdf.png

userdao的所有的日志都不打印了。


二、日志文件输出


配置属性在这个类org.springframework.boot.context.logging.LoggingApplicationListener

1dc618a0ed9580ce8bfa6facb208c08f.png

这个类中有LogFile这个类:

5d4c6812c8535adbb050f4ddf2e1bce8.png

配置属性都在这个类里:

46a9d80a6e05e4e3b19d57a0ee70bcdf.png

application.properties可以设置文件路径地址和 控制台输出的格式,日志文件格式


logging.file.path=e:/tmp/my.log 指定文件路径地址

日志文件输出,文件的大小10M之后,就会分割了。


指定文件输出格式:

logging.pattern.console //配置控制台输出日志的pattern

logging.pattern.file //配置日志文件输出日志的pattern


更多配置信息:看下这个博客https://www.jianshu.com/p/1fa12b92d5c4


三.springboot 也支持log4j或者log4j2


1.使用logback.xml设置日志


springboot默认支持logback

也就是说,只需要在classpath下放一个logback.xml.logback-spring.xml的文件,即可定制日志的输出

logback.xml 例子如下:


<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="E:\\logs\\projectname" />
    <!-- 控制台输出 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 1格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--临界值日志过滤级别配置 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 1在日志级别的基础上过滤掉trace级别以下的日志 -->
            <level>trace</level>
        </filter>
    </appender>
    <!-- trace级别,按照每天生成日志文件 -->
    <appender name="trace" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}\trace-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>
            <charset>utf-8</charset>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
        <!--只保留固定配置级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>trace</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- debug级别,按照每天生成日志文件 -->
    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}\debug-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>
            <charset>utf-8</charset>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
        <!--只保留固定配置级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- info级别,按照每天生成日志文件 -->
    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}\info-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>
            <charset>utf-8</charset>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
        <!--只保留固定配置级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- warn级别,按照每天生成日志文件 -->
    <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}\warn-log-%d{yyyy-MM-dd}.log</FileNamePattern>
            <!-- <file>D:\logs\logback.%d{yyyy-MM-dd}.log</file> -->
            <!--日志文件保留天数-->
            <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>
            <charset>utf-8</charset>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
        <!--只保留固定配置级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- error级别,按照每天生成日志文件 -->
    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}\error-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>
            <charset>utf-8</charset>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
        <!--只保留固定配置级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 日志级别排序为: TRACE < DEBUG < INFO < WARN < ERROR -->
    <!-- 日志输出级别 -->
    <root level="trace">
        <appender-ref ref="stdout" />
        <appender-ref ref="trace" />
        <appender-ref ref="debug" />
        <appender-ref ref="info" />
        <appender-ref ref="warn" />
        <appender-ref ref="error" />
    </root>
</configuration>


2. 使用其他的日志组件的步骤


1:排除掉默认的日志组件: spring-boot-starter-logging


2: 加入新的日志路径依赖


3;吧响应的配置文件放到classpath下 名字可以是 logback.xml 或者logback-spring.xml


第1 、 2步


<dependencies>
       <!--   默认添加了日志依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        <!--排除logback的依赖-->
             <exclusions>
                 <exclusion>
                     <groupId>org.springframework.boot</groupId>
                     <artifactId>spring-boot-starter-logging</artifactId>
                 </exclusion>
             </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
            <version>1.4.0.RELEASE</version>
        </dependency>


第3步在classpath下放一个log4j2-spring.xml活log4j.xml:


<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

设置成debug模式


四、源码中的默认日志模板


在\org\springframework\boot\spring-boot\2.2.5.RELEASE\spring-boot-2.2.5.RELEASE.jar

1dc618a0ed9580ce8bfa6facb208c08f.png

可以看到log4j2和logback的默认的xml模板和一些配置

比如从这里可以看到logback默认是使用的info日志级别。

5d4c6812c8535adbb050f4ddf2e1bce8.png

file-appender.xml 设置的是默认的文件格式信息:

46a9d80a6e05e4e3b19d57a0ee70bcdf.png


本文主要了解了springboot的日志设置,比如日志级别,修改默认日志级别,内置的日志有log4j2和logback,如何切换日志,用xml配置日志等。


相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
2月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
710 0
|
2月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
474 0
|
1月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
552 10
|
2月前
|
前端开发 Java 数据库连接
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
|
6月前
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
669 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
2月前
|
运维 安全 数据可视化
日志审查安排工具实战攻略:中小团队如何通过日志审查安排工具建立可控、安全的审查机制?
在审计敏感时代,日志审查安排工具成为安全运维与合规管理的关键利器。它实现审查任务的流程化、周期化与可视化,支持多系统协作、责任到人,确保“可控、可查、可追”的日志治理。工具如板栗看板、Asana、Monday 等提供任务调度、问题闭环与合规对接能力,助力企业构建高效、透明的日志审查体系,提升安全与合规水平。
|
6月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
855 0
|
6月前
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
88 0
|
2月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
694 1
|
2月前
|
JSON 安全 Go
Go语言项目工程化 —— 日志、配置、错误处理规范
本章详解Go语言项目工程化核心规范,涵盖日志、配置与错误处理三大关键领域。在日志方面,强调其在问题排查、性能优化和安全审计中的作用,推荐使用高性能结构化日志库zap,并介绍日志级别与结构化输出的最佳实践。配置管理部分讨论了配置分离的必要性,对比多种配置格式如JSON、YAML及环境变量,并提供viper库实现多环境配置的示例。错误处理部分阐述Go语言显式返回error的设计哲学,讲解标准处理方式、自定义错误类型、错误封装与堆栈追踪技巧,并提出按调用层级进行错误处理的建议。最后,总结各模块的工程化最佳实践,助力构建可维护、可观测且健壮的Go应用。

热门文章

最新文章