Alex.
Alex.

Reputation: 63

Avoid sparse files with tee and logrotate

We have our Java application running in docker. As there is the possibility that before logback kicks in something can go wrong, we log the startup output of our application to a file. In addition we use filebeat to transfer logs from docker to ELK.

So in docker's entrypoint.sh we use

    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

to duplicate/redirect STDOUT/STDERR to a log file and to docker (for filebeat to pick up docker logs).

The issue now is that tee

Is there any suggestions of a different way to do this? Any (standard unix tool) tee replacement that does reopen and/or not seek?

Or is there some bash magic to redirect/duplicate one stream to multiple endpoints? (I read somewhere that zsh can do this like cat file > file1 > file2 - not sure if any of the "fileX" could be STDOUT again though)

Upvotes: 0

Views: 506

Answers (1)

Alex.
Alex.

Reputation: 63

After no useful findings and also no response from the GNU coreutils devs on their mailing list on tee, I replaced tee with good old perl one liner:

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

This seems to work stable under the given load of STDOUT.

Upvotes: 1

Related Questions