Избегайте разреженных файлов с помощью tee и logrotate - PullRequest
0 голосов
/ 06 августа 2020

Наше приложение Java работает в docker. Поскольку существует вероятность того, что до того, как произойдет возврат в систему, что-то может go ошибиться, мы записываем результаты запуска нашего приложения в файл. Кроме того, мы используем filebeat для передачи журналов из docker в ELK.

Итак, в точке входа docker. 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 журналы).

Проблема теперь в том, что tee

  • не открывает файл журнала повторно, когда он удаляется с помощью logrotate (продолжает запись в удаленный индексный дескриптор) или
  • настаивает на поиске старого места, где он остановился при создании файла запасных частей (при использовании copytruncate logrotate).

Есть ли какие-нибудь предложения, как это сделать? Любая (стандартная unix инструментальная) замена тройника, которая повторно открывается и / или не ищет?

Или есть bash magi c для перенаправления / дублирования одного потока на несколько конечных точек? (Я где-то читал, что zsh может делать это как cat file> file1> file2 - хотя я не уверен, может ли какой-либо из «fileX» снова быть STDOUT)

...