【发布时间】: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