如何将日志文件保存到 docker 卷中
How to save logfiles into a docker volume
我有一个 java 应用程序。我将项目导出为 .war 文件,构建 docker 容器并 运行 它。
在我的应用程序中,我定义了我的变量:
private static final Logger logger = Logger.getLogger(BusController.class.getName());
对于我使用的输出,例如:
logger.warning("User "+XYZ+" not found!");
然后我创建了一个 logback.xml,日志将保存在我的 HDD 中,并带有一个 timetemp。我也在这里找到了解决方案。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<logger name="org.springframework.web" level="INFO"/>
<timestamp key="Timestamp" timeReference="contextBirth" datePattern="yyyy-MM-dd'_'HH-mm-ss"/>
<!-- Send debug messages to System.out -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- By default, encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/opt/docker-busapi/data/logs/busicroservice-${myTimestamp}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{yyyy-MM-dd_HH:mm:ss} - %msg%n</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>busmicroservice.%i{yyyy-MM-dd_HH:mm:ss.SSS}}.log</FileNamePattern>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>30MB</MaxFileSize>
</triggeringPolicy>
</appender>
<logger name="mypackage" level="INFO" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</logger>
行得通,我所有的日志都将保存在我的 windows 环境下的“/opt/docker-busapi/data/logs”(我创建了文件夹结构)
我现在还可以通过 docker 文件中的 -v 参数挂载我的额外卷:
REGISTRY=xxxxx.net
VERSION=latest
IMAGE=busMicroservice
SERVICE=busmicroservice
LOCAL_DATA_PATH=/opt/docker-busapi/data
docker run -p xxxx:xxxxx -d -v $LOCAL_DATA_PATH:/logs --name $SERVICE --hostname $SERVICE $REGISTRY/$IMAGE:$VERSION
因为如果我检查我的 docker 容器,卷已安装。
通过 "docker inspect busmicroservice" 我得到:
"Mounts": [
{
"Type": "bind",
"Source": "/opt/docker-busapi/data",
"Destination": "/logs",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
但是我的日志不会保存在我的日志文件夹中。
我猜路径还是有问题。我必须在 "docker run" 命令中输入哪个路径?
看起来你的文件路径名不一致,在某些地方你定义了这个:
/opt/docker-busapi/data/logs/
而在其他情况下,您有:
/opt/docker-busmicroservice/data
然后在Docker容器中,你说这个应该在容器中使用:
/logs
如果您希望所有文件都转到 /opt/docker-busapi/data/logs/
的 主机目录 ,那么,首先要确保该目录存在并且您对其设置了正确的权限,然后确保您的 应用程序 使用 /logs
作为保存目录。
那么当你 运行:
docker run -p xxxx:xxxxx -d -v /opt/docker-busapi/data/logs:/logs --name my_service --hostname my_hostname image:version
那你应该可以走了。
我有一个 java 应用程序。我将项目导出为 .war 文件,构建 docker 容器并 运行 它。
在我的应用程序中,我定义了我的变量:
private static final Logger logger = Logger.getLogger(BusController.class.getName());
对于我使用的输出,例如:
logger.warning("User "+XYZ+" not found!");
然后我创建了一个 logback.xml,日志将保存在我的 HDD 中,并带有一个 timetemp。我也在这里找到了解决方案。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<logger name="org.springframework.web" level="INFO"/>
<timestamp key="Timestamp" timeReference="contextBirth" datePattern="yyyy-MM-dd'_'HH-mm-ss"/>
<!-- Send debug messages to System.out -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- By default, encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/opt/docker-busapi/data/logs/busicroservice-${myTimestamp}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{yyyy-MM-dd_HH:mm:ss} - %msg%n</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>busmicroservice.%i{yyyy-MM-dd_HH:mm:ss.SSS}}.log</FileNamePattern>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>30MB</MaxFileSize>
</triggeringPolicy>
</appender>
<logger name="mypackage" level="INFO" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</logger>
行得通,我所有的日志都将保存在我的 windows 环境下的“/opt/docker-busapi/data/logs”(我创建了文件夹结构)
我现在还可以通过 docker 文件中的 -v 参数挂载我的额外卷:
REGISTRY=xxxxx.net
VERSION=latest
IMAGE=busMicroservice
SERVICE=busmicroservice
LOCAL_DATA_PATH=/opt/docker-busapi/data
docker run -p xxxx:xxxxx -d -v $LOCAL_DATA_PATH:/logs --name $SERVICE --hostname $SERVICE $REGISTRY/$IMAGE:$VERSION
因为如果我检查我的 docker 容器,卷已安装。 通过 "docker inspect busmicroservice" 我得到:
"Mounts": [
{
"Type": "bind",
"Source": "/opt/docker-busapi/data",
"Destination": "/logs",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
但是我的日志不会保存在我的日志文件夹中。 我猜路径还是有问题。我必须在 "docker run" 命令中输入哪个路径?
看起来你的文件路径名不一致,在某些地方你定义了这个:
/opt/docker-busapi/data/logs/
而在其他情况下,您有:
/opt/docker-busmicroservice/data
然后在Docker容器中,你说这个应该在容器中使用:
/logs
如果您希望所有文件都转到 /opt/docker-busapi/data/logs/
的 主机目录 ,那么,首先要确保该目录存在并且您对其设置了正确的权限,然后确保您的 应用程序 使用 /logs
作为保存目录。
那么当你 运行:
docker run -p xxxx:xxxxx -d -v /opt/docker-busapi/data/logs:/logs --name my_service --hostname my_hostname image:version
那你应该可以走了。