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 个解决方案

AllenJiang
中间件研发,关注微信公众号 : 小哈学Java, 回复"666", 即可免费领取10G学习&面试资料

关于控制台输出可以参考下面这个解决方案:

如何查看运行在 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