docker springboot日志挂载到宿主卷轴

springboot服务运行在docker容器中,产生的日志会随容器删除而被删除,而且也不好管理日志,比如做日志切割等,所以我们一般会把日志挂载到宿主机器上,这样运维人员也好管理日志,从日志定位问题也比较方便。

前提必须安装了docker和jdk8

1.首先需要让springboot产生日志文件到某个目录,比如/logs目录,一般情况下,springboot运行是没有日志文件产生的,这个日志文件并不是catalina.out,catalina.out为控制台输出,可以通过dockerlogs实时查看,但并不会生成一个日志文件的,之前一直以为catalina.out有输出就会在挂载卷有日志文件存在,其实不会,懵逼了好久。

这里我们可以结合logback,就是给springboot配置logback-spring.xml,然后让日志输出到/logs目录下

logback-spring.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!-- 项目名称 -->
    <property name="PROJECT_NAME" value="demo2" />

    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="./logs" />

    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %highlight([%-5level] %logger{50} - %msg%n)</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 按照每天生成日志文件 -->   
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">   
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/catalina.%d{yyyy-MM-dd}.log</FileNamePattern> 
            <!--日志文件保留天数-->
            <MaxHistory>15</MaxHistory>
        </rollingPolicy>   
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> 
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>   
        </encoder> 
        <!--日志文件最大的大小-->
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
         <MaxFileSize>10MB</MaxFileSize>
       </triggeringPolicy>
    </appender> 
    
    <!--myibatis log configure--> 
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    
    <!-- 开发环境下的日志配置 -->
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FILE" />
        </root>
    </springProfile>

    <!-- 生产环境下的日志配置 -->
    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="FILE" />
        </root>
    </springProfile>
</configuration>

这样springboot就会产生日志到/logs下了,这一步很重要

2.有了日志文件产生,下一步我们就给springboot做镜像了。

先通过maven把springboot打包成demo2.jar

然后在linux上新建一个文件夹

mkdir /opt/demo2

把demo2.jar放到这个文件夹下

然后在此目录下新建一个Dockerfile文件

Dockerfile内容如下:

FROM java:8
ADD demo2.jar demo2.jar
EXPOSE 8087
ENTRYPOINT ["nohup","java","-Djava.security.egd=file:/dev/./urandom","-jar","/demo2.jar","--spring.profiles.active=dev",">>","catalina.out","2>&1","&"]

执行命令创建镜像

docker build -t demo2 .

执行命令运行镜像,产生容器

docker run -d --name demo2 -v /opt/demo2/logs:/logs demo2

注意必须,得有-v/opt/demo2/logs:/logs执行容器的挂载目录

好了,我们进入容器查询,是否产生了日志文件,进入容器命令

docker exec -it demo2 /bin/sh

此次容器内的/logs目录下已经产生了catalina.log日志文件

然后退出容器,到宿主机器的/opt/demo2/logs/也有了一样的catalina.log日志文件

同样利用了logback做日志管理,按时间切割,按大小清理日志,挺好的