docker 中部署的 springboot 项目如何优雅地输出日志?
我的 springboot 项目使用 logback 打印日志,可是是打印在容器中的,我要如何方便的宿主机中查看日志?
下面是我的 logback 配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration >
<jmxConfigurator/>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property scope="context" name="appName" value="qms" />
<property name="LOG_FILE" value="/app/logs/${appName}/${appName}.%d{yyyy-MM-dd}"/>
<property name="LOG_FILE" value="/app/logs/${appName}/${appName}.%d{yyyy-MM-dd}"/>
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
<!--<property name="CONSOLE_LOG_PATTERN" value="${FILE_LOG_PATTERN}"/>-->
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出的文件名 -->
<FileNamePattern>${LOG_FILE}-%i.log</FileNamePattern>
<!-- 日志文件保留天数 -->
<MaxHistory>30</MaxHistory>
<!-- 日志文件最大的大小 -->
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度 %errorMessage:日志消息,%n 是换行符 -->
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<springProfile name="dev">
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<root level="info">
<appender-ref ref="CONSOLE" />
</root>
</springProfile>
<springProfile name="prd">
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
</configuration>
1 个解决方案
关于控制台输出可以参考下面这个解决方案:
如何查看运行在 docker 容器中 springboot 项目打印的控制台日志
但是生产环境一般不推荐控制台输出,因为控制台输出的日志没有持久化,只能实时查看。生产环境下,一般都是输出到文件中,然后挂载到宿主机的方式来解决,我们只需要将 logback
输出的日志路径挂载到宿主机的指定的路径即可:
我这里是通过 docker-compose.yml
服务编排的配置文件来指定,如果你不使用 docker-compose
也可以在手动启动 springboot 容器的时候,通过 -v
命令来将容器中的日志输出路径挂载到宿主机中:
下面是 docker-compose.yml 文件,通过添加 volumes
配置,后面跟上宿主机挂载的路径和容器中的日志输出路径:
version: '3'
services:
qms:
image: exception/qms:latest
container_name: qms
environment:
- JAVA_OPTS=-Xms300m -Xmx300m -Dspring.profiles.active=prd
ports:
- 8090:8090
volumes:
- /app/logs/qms:/app/logs/qms
重新启动 springboot 服务,去 /app/logs/qms
查看是否有日志:
可以看到容器中的日志文件,已经被挂载到了宿主机中指定的目录下,接下来我们就可以通过日志查看命令,查看日志了:
tailf qms.2018-08-05-0.log