Наше приложение 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)