Docker运行SpringBoot项目后,由于用docker logs 查看项目的日志非常麻烦,不能用grep过关键字查询。我感觉痛不欲生,所以就想着公司也是用Docker跑的项目,那么我的项目也用公司的日志吧。看一张公司的日志图吧。结构非常的好。而且分了时间段。所以,我也想着把自己的项目日志做成这个样子。
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
注意点:注意docker run命令中的-v /etc/timezone变成了-v /etc/timezone/timezone
以上则为将Docker容器内的日志映射到服务器中。