logback是日志引擎log4j的配置文件。关于这个配置文件的作用和如何配置本文不做过多赘述,网上很多资料可查。
本文主要介绍,logback文件在容器化的部署过程中,如何部署logback.xml配置文件。
场景logback主要能力是控制日志等级和输出位置,以及滚动策略。所以,在实际部署过程中会面临以下问题:
- 测试环境和正式环境的输出位置,滚动策略不同,需要区别开来。
- 测试环境和正式环境的日志级别不同。测试环境一般开启debug级别,而正式环境一般是开启error级别,或warn级别。
- 日志级别不是一成不变的,当正式环境出问题,需要调整日志级别,dump日志内容时,能够修改日志级别。
一般来说,会通过配置中心统一管理配置的方式来实现以上能力。本文的场景是,没有配置中心,且是但应用的前提下,如何配置logback.xml文件,来适配以上问题。
方案话不多说,直接上方案。
- 测试环境和正式环境配置不同
首先为了解决这个问题,可以使用两个版本的配置文件logback-test.xml和logback-prod.xml。在这两个文件中,分别配置测试环境和正式环境的logback配置。并将文件放置在resources下,比如resources/logback。可以分别配置日志的输出位置,滚动备份策略及日志级别等。
为了应用可以识别,可以使用配置项logging.config配置项配合环境变量来实现。例如:
logging.config=classpath:/logback/logback-#{LOGBACK_PROFILE:prod}.xml
-
支持配置文件修改
上述方案将配置文件打到了jar包中,虽然支持了选择版本,但是无法修改配置文件。有三种方案,可以实现配置文件修改:- 同样使用环境变量来控制日志等级
该方案在日志类型较多时,会产生很多环境配置。且修改的灵活性比较低,如果需要对配置文件的修改进行受控,可以选择该方式。 - 将xml配置文件放置到容器目录中,并指定容器目录为配置文件目录。该方案修改灵活性很大,甚至可以修改整改配置文件,受控性较差。
- 折衷方案,将不能修改的配置,单独拆出来,放置在jar包中,然后在外挂的配置文件中通过include引用jar包中的配置项。
例如:
- 同样使用环境变量来控制日志等级
推荐使用第三种方式。
实现那么怎么实现呢?上代码,教你完成配置。
- 首先第一步,还是准备好需要外挂的配置文件,并放置在resources/logback目录下。
- 在application.properties文件中增加配置
logging.config=${HOME}/logback/logback-${LOGBACK_PROFILE:prod}.xml
注意:此处使用${HOME}是为了方便本地调试。
- 配置编译参数
在pom文件中,配置build节点参数,增加一个resource节点,作用是编译时,将logback配置文件复制到target目录下。
${project.basedir}/src/main/resources/logback ${project.basedir}/target/logback
如下图:
- 编辑DockerFile文件,制作镜像时,将target中的logback文件复制出来。
# 复制文件并更改用户和用户组 COPY --chown=user:user ./logback/logback-*.xml /app/logback/ # 设置HOME环境变量 ENV HOME=/app/ # 设置默认的启动环境变量 ENV LOGBACK_PROFILE=prod
DockerFile需要制作镜像后,并实际部署才能验证。这里只验证本地环境。
验证因为上面配置过程中,指定配置文件时,使用了${HOME}环境变量,所以在本地验证时,可以事先建立好本地的配置文件存放目录。
例如我在工程中新建了一个目录来存放配置文件。
然后在IDEA的启动参数中,设置好HOME环境变量。
这样,我们就可以模拟应用访问外部的配置文件。
然后编写一个测试类,打印各个级别的日志。
@RestController
@RequestMapping("/logback")
public class LogbackTestController {
private static final Logger LOGGER = LoggerFactory.getLogger(LogbackTestController.class);
@GetMapping("/test")
public void logbackTest(){
LOGGER.error("this is a error log msg.");
LOGGER.warn("this is a warn log msg.");
LOGGER.debug("this is a debug log msg.");
LOGGER.info("this is a info log msg.");
}
}
两个配置文件中,日志级别的配置如下:
test:info级别日志,打印info,warn,error日志
prod:error级别日志,只打印error日志
启动工程,然后访问接口,可以看到控制台只打印了error日志,因为我们在配置时,默认使用了prod版本。
控制台输出:
在启动环境变量中新增配置文件版本参数,并配置为test
重新启动,再测试一次
控制台打印了info,warn,error日志。
希望本文对大家有帮助。有任何疑问,欢迎讨论。



