使用 tee 和 logrotate 避免稀疏文件
Avoid sparse files with tee and logrotate
我们在 docker 中有 Java 应用程序 运行。由于有可能在 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
到 duplicate/redirect STDOUT/STDERR 到日志文件和 docker(让 filebeat 获取 docker 日志)。
现在的问题是发球台
- 当日志文件被 logrotate 移走时不重新打开日志文件(继续写入已删除的 inode)或
- 坚持寻找它停止创建备用文件的旧位置(使用 logrotate 的 copytruncate 时)。
是否有任何关于执行此操作的不同方法的建议?任何(标准 unix 工具)重新打开的 T 恤替换 and/or 不寻找?
或者是否有一些 bash 魔法可以 redirect/duplicate 一个流到多个端点? (我在某处读到 zsh 可以执行此操作,例如 cat file > file1 > file2 - 不确定是否有任何“fileX”可以再次成为 STDOUT)
在没有找到有用的发现并且 GNU coreutils 开发人员在他们关于 tee 的邮件列表中也没有任何回应之后,我用旧的 perl one liner 替换了 tee:
exec > >( perl -pe 'open($fh, ">>", "'$LOGFILE'"); print $fh $_; close($fh)' ) 2>&1
这似乎在给定的 STDOUT 负载下工作稳定。
我们在 docker 中有 Java 应用程序 运行。由于有可能在 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
到 duplicate/redirect STDOUT/STDERR 到日志文件和 docker(让 filebeat 获取 docker 日志)。
现在的问题是发球台
- 当日志文件被 logrotate 移走时不重新打开日志文件(继续写入已删除的 inode)或
- 坚持寻找它停止创建备用文件的旧位置(使用 logrotate 的 copytruncate 时)。
是否有任何关于执行此操作的不同方法的建议?任何(标准 unix 工具)重新打开的 T 恤替换 and/or 不寻找?
或者是否有一些 bash 魔法可以 redirect/duplicate 一个流到多个端点? (我在某处读到 zsh 可以执行此操作,例如 cat file > file1 > file2 - 不确定是否有任何“fileX”可以再次成为 STDOUT)
在没有找到有用的发现并且 GNU coreutils 开发人员在他们关于 tee 的邮件列表中也没有任何回应之后,我用旧的 perl one liner 替换了 tee:
exec > >( perl -pe 'open($fh, ">>", "'$LOGFILE'"); print $fh $_; close($fh)' ) 2>&1
这似乎在给定的 STDOUT 负载下工作稳定。