Bash 使用tee和logrotate避免稀疏文件

Bash 使用tee和logrotate避免稀疏文件,bash,sparse-matrix,io-redirection,tee,logrotate,Bash,Sparse Matrix,Io Redirection,Tee,Logrotate,我们的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>&a

我们的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工具)T形三通替换


或者是否有一些bash魔法可以将一个流重定向/复制到多个端点?(我在某个地方读到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负载下,这似乎工作稳定。

似乎,tee-a避免了稀疏文件的生成,但仍然不会重新创建输出文件。