栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

logback容器化部署实践指南

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

logback容器化部署实践指南

摘要

logback是日志引擎log4j的配置文件。关于这个配置文件的作用和如何配置本文不做过多赘述,网上很多资料可查。

本文主要介绍,logback文件在容器化的部署过程中,如何部署logback.xml配置文件。

场景

logback主要能力是控制日志等级和输出位置,以及滚动策略。所以,在实际部署过程中会面临以下问题:

  1. 测试环境和正式环境的输出位置,滚动策略不同,需要区别开来。
  2. 测试环境和正式环境的日志级别不同。测试环境一般开启debug级别,而正式环境一般是开启error级别,或warn级别。
  3. 日志级别不是一成不变的,当正式环境出问题,需要调整日志级别,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包中,虽然支持了选择版本,但是无法修改配置文件。有三种方案,可以实现配置文件修改:

    1. 同样使用环境变量来控制日志等级
      该方案在日志类型较多时,会产生很多环境配置。且修改的灵活性比较低,如果需要对配置文件的修改进行受控,可以选择该方式。
    2. 将xml配置文件放置到容器目录中,并指定容器目录为配置文件目录。该方案修改灵活性很大,甚至可以修改整改配置文件,受控性较差。
    3. 折衷方案,将不能修改的配置,单独拆出来,放置在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日志。

结语

希望本文对大家有帮助。有任何疑问,欢迎讨论。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/686868.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号