[问题记录] spring-boot 打印启动时间

本文探讨了Spring Boot应用启动后未显示启动时间的问题。通过检查源代码,发现此信息作为INFO级别日志输出,若日志配置级别设置为WARN,则不会显示。将日志级别调整为INFO即可解决问题。

问题
spring-boot 工程启动结束会打印启动时间
Started Application in 12.805 seconds (JVM running for 20.686)

最近新建一个工程发现启动完后并没有打印上面的那句话

解决

查看源码,发现打印日志在

public ConfigurableApplicationContext run(String... args) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        ConfigurableApplicationContext context = null;
        FailureAnalyzers analyzers = null;
        configureHeadlessProperty();
        SpringApplicationRunListeners listeners = getRunListeners(args);
        listeners.starting();
        try {
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(
                    args);
            ConfigurableEnvironment environment = prepareEnvironment(listeners,
                    applicationArguments);
            Banner printedBanner = printBanner(environment);
            context = createApplicationContext();
            analyzers = new FailureAnalyzers(context);
            prepareContext(context, environment, listeners, applicationArguments,printedBanner);

            //著名的refresh 
            refreshContext(context);

            afterRefresh(context, applicationArguments);
            listeners.finished(context, null);
            stopWatch.stop();

            //打印启动时间日志
            if (this.logStartupInfo) {
                new StartupInfoLogger(this.mainApplicationClass)
                        .logStarted(getApplicationLog(), stopWatch);
            }
            return context;
        }
        catch (Throwable ex) {
            handleRunFailure(context, listeners, analyzers, ex);
            throw new IllegalStateException(ex);
        }
    }
public void logStarted(Log log, StopWatch stopWatch) {
        if (log.isInfoEnabled()) {
            log.info(getStartedMessage(stopWatch));
        }
    }

其打印是的info级日志,而我在logback配置启动类Application包的别类是WARN级别的,所以它并不打印时间,把启动类Application所在包日志级别改为info即可。

<think>首先,用户的问题是:“我想查找使用mybatis-spring-boot-starter实现多数据库打印SQL执行日志的方法”。用户想知道在MyBatis-Spring-Boot-Starter中,当配置多数据库时,如何打印SQL执行日志。 我需要参考提供的引用资料: - 引用[1]:介绍了MyBatis-Spring-Boot-Starter的基本功能,自动配置SqlSessionFactory和MapperScannerConfigurer。 - 引用[2]:讨论了在Spring Boot中使用MyBatis-Spring-Boot-Starter,特别是关于VFS(Virtual File System)和自动配置。提到了当使用多个数据源时,需要手动设置VFS。 - 引用[3]:给出了一个配置多数据源的例子,其中展示了如何设置SqlSessionFactoryBean,包括设置VFS为SpringBootVFS.class。 - 引用[4]:展示了一个MyBatis配置的示例,包括数据源配置和mybatis.mapper-locations的设置。 - 引用[5]:警告不要使用druid-spring-boot-starter,因为它可能导致IllegalArgumentException错误,原因是缺少sqlSessionFactory或sqlSessionTemplate。 用户的问题聚焦于“打印SQL执行日志”,这在引用中没有直接提到。但是,打印SQL日志通常涉及配置MyBatis的日志级别或使用日志框架如Logback或Log4j。 回想一下,MyBatis支持日志记录,可以通过设置日志实现来打印SQL语句。常见的做法是: 1. 在application.properties或application.yml中设置日志级别。 2. 使用特定的日志实现,比如SLF4J with Logback。 在Spring Boot中,MyBatis-Spring-Boot-Starter会自动配置一些东西,但打印SQL日志需要配置MyBatis的日志级别。 对于多数据库配置,用户可能配置了多个SqlSessionFactory或数据源。我需要确保在配置多个SqlSessionFactory时,每个都能正确记录日志。 从引用[3]中,有一个配置多数据源的例子: ```java @Configuration public class MyBatisConfig { @Bean public SqlSessionFactory masterSqlSessionFactory() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(masterDataSource()); factoryBean.setVfs(SpringBootVFS.class); // Sets the SpringBootVFS class // ... other configurations return factoryBean.getObject(); } } ``` 在设置SqlSessionFactoryBean时,我可以添加日志相关的配置。 在MyBatis中,要打印SQL日志,通常需要: - 设置日志实现。MyBatis可以使用多种日志实现,如SLF4J、Log4j等。 - 在MyBatis配置中指定日志级别。 在Spring Boot中,可以通过application.properties来控制日志级别。 例如,设置日志级别为DEBUG来打印SQL语句: ```properties logging.level.org.mybatis=DEBUG logging.level.com.example.mapper=DEBUG ``` 但对于多数据源,由于每个SqlSessionFactory可能对应不同的数据源,我需要确保在每个SqlSessionFactory的配置中设置日志。 在SqlSessionFactoryBean中,可以设置Configuration属性。 例如: ```java SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); // Set VFS if needed // Set configuration org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); configuration.setLogImpl(org.apache.ibatis.logging.slf4j.Slf4jImpl.class); // Set log implementation configuration.setLogPrefix("MYBATIS"); // Optional prefix factoryBean.setConfiguration(configuration); ``` 或者,在全局配置中,通过配置文件设置。 但在Spring Boot应用中,最简单的方式是通过application.properties设置日志级别。 对于多数据源,如果没有特别的命名空间,设置logging.level.org.mybatis=DEBUG应该影响所有MyBatis操作,无论数据源数量。 如果每个SqlSessionFactory需要不同的日志设置,就需要在每个SqlSessionFactoryBean中单独设置Configuration。 用户提到“多数据库打印SQL执行日志”,可能意味着针对每个数据库或数据源有不同的日志需求。 但通常,日志是全局的。不过,为了安全,我可以建议在配置SqlSessionFactory时设置日志实现。 参考引用[5],它警告说不要使用druid-spring-boot-starter,因为它可能导致错误。用户应该避免使用它,以防冲突。 现在,构建答案结构: 1. 解释如何打印SQL日志在单数据源环境下。 2. 扩展到多数据源环境。 3. 提供代码示例。 4. 确保回答在中文。 5. 生成相关问题。 步骤: -Spring Boot中,使用MyBatis-Spring-Boot-Starter,打印SQL日志可以通过设置日志级别实现。 - 对于多数据源,需要在配置SqlSessionFactory时设置日志实现。 - 给出一个例子。 从引用[3],有设置SqlSessionFactory的例子。 我可以修改它来包括日志配置。 例如: ```java @Configuration public class MyBatisConfig { @Bean public SqlSessionFactory masterSqlSessionFactory() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(masterDataSource()); factoryBean.setVfs(SpringBootVFS.class); // For Spring Boot VFS // Set MyBatis configuration for logging org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); configuration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class); // Use stdout for logging // Or use SLF4J: configuration.setLogImpl(org.apache.ibatis.logging.slf4j.Slf4jImpl.class); factoryBean.setConfiguration(configuration); // Other configurations like mapper locations factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml")); return factoryBean.getObject(); } // Similar for other data sources } ``` 或者,在application.properties中: ```properties # Set log level for MyBatis logging.level.org.mybatis.spring=TRACE logging.level.org.apache.ibatis=TRACE # For specific mappers logging.level.com.example.mapper=DEBUG ``` 在日志框架中,确保日志级别设置为DEBUG或TRACE来查看SQL。 对于多数据源,设置全局日志级别应该覆盖所有。但如果需要隔离,可能需要自定义配置。 最后,生成相关问题。 回答结构: - 解释方法。 - 提供代码片段。 - 添加引用标识在相关部分。 - 结尾生成相关问题。 确认系统指令:使用中文,数学表达式用$...$,但这里可能不需要数学。独立公式用$$...$$,但也没有。LaTeX语法正确。 </think>### 使用 MyBatis-Spring-Boot-Starter 实现多数据库 SQL 日志打印的方法 在 Spring Boot 项目中,通过 `mybatis-spring-boot-starter` 实现多数据库配置时,打印 SQL 执行日志需要结合 MyBatis 的日志机制和 Spring Boot 的日志配置。以下是逐步解决方案,适用于多数据源环境(如配置多个 `SqlSessionFactory`)。核心思路是通过设置 MyBatis 的日志实现类并在 `application.properties`/`application.yml` 中配置日志级别,确保每个数据源都能正确输出 SQL 语句。 #### 步骤 1: 配置多数据源的 SqlSessionFactory(引用自引用[3]) 在多数据源场景下,需手动配置每个 `SqlSessionFactory`,确保其包含日志实现类。MyBatis 支持多种日志框架(如 SLF4J、Log4j2),推荐使用 `Slf4jImpl` 或 `StdOutImpl` 打印 SQL 日志。以下是 Java 配置示例: ```java @Configuration public class MyBatisConfig { // 主数据源配置 @Bean public SqlSessionFactory masterSqlSessionFactory(DataSource masterDataSource) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(masterDataSource); // 设置数据源 factoryBean.setVfs(SpringBootVFS.class); // 必须设置 VFS 以支持 Spring Boot 环境 [^2][^3] // 设置 MyBatis 配置,启用 SQL 日志 org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); configuration.setLogImpl(org.apache.ibatis.logging.slf4j.Slf4jImpl.class); // 使用 SLF4J 输出日志 // 或使用 StdOutImpl 直接输出到控制台: configuration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class); factoryBean.setConfiguration(configuration); // 设置 Mapper 文件位置(可选) factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master/*.xml")); return factoryBean.getObject(); } // 从数据源配置(类似主数据源) @Bean public SqlSessionFactory slaveSqlSessionFactory(DataSource slaveDataSource) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(slaveDataSource); factoryBean.setVfs(SpringBootVFS.class); org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); configuration.setLogImpl(org.apache.ibatis.logging.slf4j.Slf4jImpl.class); factoryBean.setConfiguration(configuration); factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/slave/*.xml")); return factoryBean.getObject(); } } ``` **关键点**: - **`setVfs(SpringBootVFS.class)`**: 必须添加以支持 Spring Boot 的可执行 JAR 环境,否则可能引发类加载问题 [^2][^3]。 - **`setLogImpl()`**: 指定日志实现类。`Slf4jImpl` 集成 SLF4J 日志框架,`StdOutImpl` 直接打印到控制台(适合调试)。 - 每个 `SqlSessionFactory` 独立配置日志,确保多数据源隔离。 #### 步骤 2: 配置 Spring Boot 日志级别 在 `application.properties` 或 `application.yml` 中设置全局日志级别为 `DEBUG` 或 `TRACE`,以输出 SQL 语句。MyBatis 的 SQL 日志通常由 `org.apache.ibatis` 和 Mapper 接口包名控制: ```properties # application.properties 示例 # 设置 MyBatis 核心日志级别 logging.level.org.apache.ibatis=TRACE # 设置具体 Mapper 接口包名的日志级别(例如 com.example.mapper) logging.level.com.example.mapper=DEBUG # 设置 Spring JDBC 日志(可选,用于查看数据源操作) logging.level.org.springframework.jdbc=DEBUG ``` 或 YAML 格式: ```yaml # application.yml 示例 logging: level: org.apache.ibatis: TRACE com.example.mapper: DEBUG org.springframework.jdbc: DEBUG ``` **说明**: - `TRACE` 级别会输出 SQL 语句、参数和执行结果;`DEBUG` 级别通常只输出 SQL 语句。 - 如果使用 `StdOutImpl`,无需额外日志配置,SQL 会直接打印到控制台。 #### 步骤 3: 避免常见问题(引用自引用[5]) - **不要混合使用冲突的 Starter**: 避免引入 `druid-spring-boot-starter` 等可能与 MyBatis 冲突的依赖,否则可能引发 `java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required` 错误 [^5]。 - **依赖管理**: 确保 `pom.xml` 中只使用 `mybatis-spring-boot-starter`,例如: ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> <!-- 使用最新版本 --> </dependency> ``` #### 验证日志输出 启动应用后,执行数据库操作时,控制台或日志文件会输出类似内容: ```sql 2023-10-05 12:00:00 DEBUG com.example.mapper.UserMapper.selectUser - ==> Preparing: SELECT * FROM users WHERE id = ? 2023-10-05 12:00:00 DEBUG com.example.mapper.UserMapper.selectUser - ==> Parameters: 1(Integer) 2023-10-05 12:00:00 DEBUG com.example.mapper.UserMapper.selectUser - <== Total: 1 ``` 这表明 SQL 日志已正确打印,且多数据源配置生效。 ### 注意事项 - **日志框架兼容性**: 如果项目使用 Logback 或 Log4j2,确保添加对应依赖(Spring Boot 默认集成 Logback)。 - **性能影响**: 在生产环境中,建议将日志级别调整为 `INFO` 或 `WARN`,避免高频 SQL 日志影响性能。 - **多数据源隔离**: 通过设置不同包的日志级别(如 `logging.level.com.example.master.mapper=DEBUG` 和 `logging.level.com.example.slave.mapper=DEBUG`),可以为每个数据源定制日志输出。 通过以上步骤,您可以在多数据库配置下高效打印 SQL 执行日志,方便调试和监控 [^1][^2][^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值