【问题标题】:Avoid sparse files with tee and logrotate使用 tee 和 logrotate 避免稀疏文件
【发布时间】: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


【解决方案1】:

在没有有用的发现并且 GNU coreutils 开发人员在他们关于 tee 的邮件列表中也没有回复后,我用旧的 perl one liner 替换了 tee:

exec > >( perl -pe 'open($fh, ">>", "'$LOGFILE'"); print $fh $_; close($fh)' ) 2>&1

这似乎在给定的 STDOUT 负载下工作稳定。

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2014-08-12
    • 2014-10-03
    • 2023-03-08
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多