Bash 使用tee和logrotate避免稀疏文件
我们的Java应用程序在docker中运行。由于在logback启动之前可能会出现一些问题,因此我们将应用程序的启动输出记录到一个文件中。 此外,我们使用filebeat将日志从docker传输到ELK 所以在docker的entrypoint.sh中我们使用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
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时)
或者是否有一些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避免了稀疏文件的生成,但仍然不会重新创建输出文件。