【问题标题】:Spring boot docker mount shared logback config filesSpring boot docker mount 共享 logback 配置文件
【发布时间】:2018-05-08 14:39:26
【问题描述】:

我有一个带有微服务架构的 Spring Boot 应用程序。运行着 10 个 Spring Boot 容器。

我打算做的加载 logback.xml 的设置看起来像这样。

当我启动容器时,如何在 Spring Boot 嵌入式 jar / 容器上挂载和加载 logback.xml。

我的想法是这样的。

这将运行 spring boot 应用程序。

docker run -d --name=app1 app_image

这样的事情就是我想要实现的加载 logback.xml

docker run -d --name=app1 --volume=/home/host-path/log-back-conig-dir/:/container-app-dir/ app_image

docker run -d --name=app2 --volume=/home/host-path/log-back-conig-dir/:/container-app-dir/ app_image

docker run -d --name=app3 --volume=/home/host-path/log-back-conig-dir:/container-app-dir/

更多信息

我使用的是 Spring Boot 官方的 Dockerfile 示例

spring.io/guides/gs/spring-boot-docker

Dockerfile

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

logback.xml 看起来像这样

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
    <include resource="org/springframework/boot/logging/logback/base.xml" />

    <springProfile name="default,dev,staging">
        <logger name="guru.springframework.controllers" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE" />
        </logger>
    </springProfile>

    <springProfile name="dev">
        <appender name="stash" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>info</level>
            </filter>
            <file>/varlog/log-tracing-demo/build/logs/${springAppName}.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>/var/log/log-tracing-demo/build/logs/${springAppName}.log.%d{yyyy-MM-dd}</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder class="net.logstash.logback.encoder.LogstashEncoder" >
                <includeContext>false</includeContext>
                <fieldNames>
                    <message>msg</message>
                </fieldNames>
                <customFields>{"application_name":"${springAppName}"}</customFields>
            </encoder>
        </appender>
        <root level="info">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="stash" />
        </root>
    </springProfile>
</configuration>

问题的简短版本是..

如何让多个 spring boot docker 容器挂载并共享同一个 logback.xml 文件。

【问题讨论】:

  • 您可以将 logback.xml 添加到您的 Dockerfile 并让您的所有应用程序使用相同的配置文件。但是,Docker 已经生成了日志。因此,将 Spring 应用程序记录到 STDOUT 并使用 ELK 堆栈之类的东西将所有日志收集到一个地方可能是个好主意。
  • 我想让 STDOUT 保持人类可读而不是 json。输出到文件的那些是 json 格式... json 格式意味着我不必编写 grok 解析器并且更不容易更改。
  • 或者,您可以将 logback.xml 创建为 lib 项目并上传到私有工件并添加对应用程序项目的依赖。

标签: java spring docker logstash devops


【解决方案1】:

我建议使用 Dockerfile 命令将 logback.xml 文件放在您的图像中:

ADD logback.xml container-app-dir/

如果您不想将您的 xml 配置放在 Dockerfile/image 中,您可以使用跨所有容器共享的命名卷,这是很好的信息:Docker Compose - Share named volume between multiple containers 因此,您可以下载此配置,例如在运行时(通过制作 wget)并将其放入共享命名卷中。

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2015-09-17
    • 2017-05-17
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多