【发布时间】:2020-08-06 15:08:19
【问题描述】:
我们的 Java 应用程序在 docker 中运行。由于在 logback 启动之前可能会出现问题,因此我们将应用程序的启动输出记录到文件中。 此外,我们使用 filebeat 将日志从 docker 传输到 ELK。
所以在docker的entrypoint.sh中我们使用
STARTUPDATE=$(date '+%Y_%m_%d_%H_%M_%S')
exec > >(tee "/appl/log/app-$STARTUPDATE.log") 2>&1
echo "Container startup time: $(date)"
cat /appl/build-info.txt
exec java -jar -Dspring.profiles.active=$SPRING_PROFILE $JAVA_ARGS $ADDITIONAL_JAVA_ARGS $1
将 STDOUT/STDERR 复制/重定向到日志文件和 docker(以便 filebeat 获取 docker 日志)。
现在的问题是那个发球台
- 当日志文件被 logrotate 移走时不会重新打开它(继续写入已删除的 inode)或
- 坚持寻找它停止创建备用文件的旧位置(使用 logrotate 的 copytruncate 时)。
有什么不同的方法可以做到这一点的建议吗?是否有任何(标准 unix 工具)可重新打开和/或不查找的 tee 替换?
或者是否有一些 bash 魔法可以将一个流重定向/复制到多个端点? (我在某处读到 zsh 可以做到这一点,例如 cat file > file1 > file2 - 不确定是否有任何“fileX”可以再次成为 STDOUT)
【问题讨论】:
-
看起来, tee -a 避免了稀疏文件的生成,但仍然没有重新创建输出文件。
标签: bash sparse-matrix io-redirection tee logrotate