使用 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 日志)。

现在的问题是发球台

是否有任何关于执行此操作的不同方法的建议?任何(标准 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 负载下工作稳定。