Docker部署SpringBoot应用,将日志保存在服务器中

3,353 阅读3分钟

Docker运行SpringBoot项目后,由于用docker logs 查看项目的日志非常麻烦,不能用grep过关键字查询。我感觉痛不欲生,所以就想着公司也是用Docker跑的项目,那么我的项目也用公司的日志吧。看一张公司的日志图吧。结构非常的好。而且分了时间段。所以,我也想着把自己的项目日志做成这个样子。

image.png

1.配置日志文件

在resource中添加logback-spring.xml,并将项目打包传到自己的服务器。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/middle.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M - %msg%n</Pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/middle_%d{dd-MM-yyyy}_%i.log</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>90000MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE"/>
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

配置日志的application.yml文件

logging:
  file:
    path: /var/logs/contacts

2.项目运行

直接构建、运行打包好的项目。

#1.无任何挂载直接将项目运行查看日志会保存在容器内的目录
docker run --name test-tuitui -p 8091:8091  -d test-tuitui
#2.进入到容器中;a6a5153f39dc为容器id
docker exec -it a6a5153f39dc /bin/bash
#3.进到我们配置的文件夹
cd /var/logs/contacts
#4.查看当前路径
pwd

将容器的目录挂在在服务器的目录中,方便查看日志

#1.将容器内的日志目录挂载到服务器中,我保存在服务器目录中的/home/contacts/prod/prod-logs/文件下
docker run --name tuitui -p 8090:8090 -v /home/contacts/prod/prod-logs/:/var/logs/contacts   -d tuitui
#2.查看日志发现时间不对,发现少了8h。所以查看本地时间,发现服务器的时间是正确的的。那么将服务器的时间挂载到容器里
[root@VM-0-8-centos prod-logs]# date
2021年 03月 11日 星期四 20:38:15 CST
#3.将时间挂载到容器里,发现报错
[root@VM-0-8-centos test] docker run --name test-tuitui -p 8091:8091 -v /home/contacts/test/test-logs/:/LOG_PATH_IS_UNDEFINED -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime  -d test-tuitui
83f33bd56b84c5af8baf41758afc49af9308edab29e18e0a77a27ecd27e350a7
报错:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: process_linux.go:459: container init caused: rootfs_linux.go:59: mounting "/etc/timezone" to rootfs at "/var/lib/docker/overlay2/21ca693b29905841219b1f2a920e695980c0c7c7cc1a70cea2831ea4b4fa31da/merged/etc/timezone" caused: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
#3.原因是centos7.6中/etc/timezone是一个文件夹,而不是一个文件。执行下面的命令
echo 'Asia/Shanghai' > /etc/timezone/timezon
#4.再次执行3中的脚本,正常启动。无报错
docker run --name test-tuitui -p 8091:8091 -v /home/contacts/test/test-logs/:/var/logs/contacts -v /etc/timezone/timezone:/etc/timezone -v /etc/localtime:/etc/localtime  -d test-tuitui

image.png

注意点:注意docker run命令中的-v /etc/timezone变成了-v /etc/timezone/timezone

以上则为将Docker容器内的日志映射到服务器中。