Spring Cloud Spring Boot mybatis分布式微服务云架构(三十九)对log4j进行多环境不同日志级别的控制...

本文介绍如何在Spring Boot项目中实现多环境配置,包括开发、测试和生产环境。通过创建不同的配置文件来设定各环境的日志级别,并利用log4j动态加载这些设置。
尝试改造

先以chapter4-2-2工程作为基础工程,我们来进行多环境配置的改造。

  • 创建多环境配置文件
    • application-dev.properties:开发环境
    • application-test.properties:测试环境
    • application-prod.properties:生产环境
  • application.properties中添加属性:spring.profiles.active=dev(默认激活application-dev.properties配置)
  • application-dev.propertiesapplication-test.properties配置文件中添加日志级别定义:logging.level.com.didispace=DEBUG
  • application-prod.properties配置文件中添加日志级别定义:logging.level.com.didispace=INFO

通过上面的定义,根据logging.level.com.didispace在不同环境的配置文件中定义了不同的级别,但是我们已经把日志交给了log4j管理,看看我们log4j.properties中对com.didispace包下的日志定义是这样的,固定定义了DEBUG级别,并输出到名为didifile定义的appender中。


# LOG4J配置
log4j.category.com.didispace=DEBUG, didifile

# com.didispace下的日志输出
log4j.appender.didifile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.didifile.file=logs/my.log
log4j.appender.didifile.DatePattern='.'yyyy-MM-dd
log4j.appender.didifile.layout=org.apache.log4j.PatternLayout
log4j.appender.didifile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n

那么,要如何动态的改变这个DEBUG级别呢?在《Spring Boot属性配置文件详解》中还提到了关于配置文件中参数的引用。我们需要将DEBUG替换成application-{profile}.properties配置文件中定义logging.level.com.didispace即可,所以配置变为如下内容:


# LOG4J配置
log4j.category.com.didispace=${logging.level.com.didispace}, didifile

# com.didispace下的日志输出
log4j.appender.didifile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.didifile.file=logs/my.log
log4j.appender.didifile.DatePattern='.'yyyy-MM-dd
log4j.appender.didifile.layout=org.apache.log4j.PatternLayout
log4j.appender.didifile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n

到这里我们已经完成了所有配置工作,我们可以通过运行单元测试,然后看my.log文件中输出的日志内容。通过修改默认的application-dev.properties配置的日志级别为INFO,再运行单元测试的DEBUG内容是否被输出到了my.log中验证参数是否被正确引用了。

对于不同环境的使用人员也不需要改变代码或打包文件,只需要通过执行命令中参加参数即可,比如我想采用生产环境的级别,那么我可以这样运行应用:


java -jar xxx.jar --spring.profiles.active=prod

源码来源

转载于:https://my.oschina.net/u/3776687/blog/1632028

在构建一个包含日志记录、数据访问和多线程处理功能的企业级Spring Cloud应用时,集成Log4j作为日志框架、MyBatis作为持久层解决方案,并启用多线程支持是关键步骤。以下将详细说明如何实现这些功能。 ### 集成Log4j2 为了使用Log4j2进行日志记录,首先需要确保你的项目依赖中包含了正确的库。对于Spring Boot项目来说,通常会排除默认的日志实现(如Logback),然后添加Log4j2的依赖项。这可以通过修改`pom.xml`文件来完成: ```xml <dependencies> <!-- 排除spring-boot-starter中的默认日志依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加log4j2核心依赖 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> <!-- 请根据实际情况选择最新版本 --> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j2-impl</artifactId> <version>2.17.1</version> <!-- 与上面保持一致 --> </dependency> </dependencies> ``` 此外,还需要提供一个`log4j2.xml`配置文件来定义日志行为,该文件应放置于资源目录下(例如src/main/resources)。 ### 配置MyBatis与多数据源支持 要整合MyBatisSpring Cloud应用程序中并支持多个数据库连接池,可以采用动态数据源切换策略。这里以基于AbstractRoutingDataSource的方式为例展示基本设置: 1. 定义主数据源和次数据源。 2. 创建一个抽象路由数据源类继承自`AbstractRoutingDataSource`并重写determineCurrentLookupKey方法。 3. 在配置类中声明Bean并将实际的数据源实例绑定至抽象路由数据源。 下面是一个简化的示例代码片段: ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.slave") public DataSource slaveDataSource() { return DataSourceBuilder.create().build(); } @Bean public DataSource routingDataSource(DataSource masterDataSource, DataSource slaveDataSource) { AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource() { @Override protected Object determineCurrentLookupKey() { // 实现逻辑判断当前应该返回哪个数据源标识符 return DynamicDataSourceContextHolder.getDataSourceType(); } }; Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put("master", masterDataSource); targetDataSources.put("slave", slaveDataSource); routingDataSource.setTargetDataSources(targetDataSources); routingDataSource.setDefaultTargetDataSource(masterDataSource); // 设置默认数据源 return routingDataSource; } @Primary @Bean public DataSource dataSource(DataSource routingDataSource) { return ProxyFactory.getProxy(routingDataSource, (Advised) routingDataSource).getProxy(); } } ``` 同时,在application.yml中配置相应的数据源信息: ```yaml spring: datasource: master: url: jdbc:mysql://localhost:3306/master_db?useSSL=false&serverTimezone=UTC username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver slave: url: jdbc:mysql://localhost:3306/slave_db?useSSL=false&serverTimezone=UTC username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver ``` ### 启用多线程处理 Spring Framework提供了强大的并发支持,包括通过@Async注解轻松开启异步方法调用的能力。启用此特性前,请确认已在主启动类或配置类上启用了@EnableAsync: ```java @SpringBootApplication @EnableAsync public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 接着,在服务组件中编写带有@Async的方法即可自动获得非阻塞执行效果: ```java @Service public class SomeService { private static final Logger logger = LogManager.getLogger(SomeService.class); @Async public void performLongRunningTask() { try { Thread.sleep(5000); // 模拟长时间操作 logger.info("长时间任务已完成"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 处理中断异常 } } } ``` 以上步骤涵盖了从日志系统搭建到高效利用硬件资源进行并行计算的基础架构建设过程。当然,针对特定业务需求可能还需进一步定制优化[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值