logrotate добавление журналов в новый файл вместо его удаления - PullRequest
0 голосов
/ 16 апреля 2020

У меня на запущенных заданиях flink было oop с пряжей в качестве менеджера ресурсов, где журналы TaskManager записываются в файл taskmanager.out на регулярной основе. Я хочу вращать журналы всякий раз, когда размер журналов превышает 50 МБ, и тот же файл не изменяется (изменение файла привело к тому, что приложение cra sh). Я попробовал следующие настройки logrotate, чтобы исправить смещение log-rotate, но, похоже, оно показывает ошибочное поведение

/var/log/hadoop-yarn/containers/application_1586151187384_0057/container_1586151187384_0057_01_000002/taskmanager.out {    
    missingok
    rotate 0
    size 50M
    copytruncate
}

В соответствии с условием, он не должен сохранять новый файл, сформированный из поворота. Размер файла должен быть> 50 МБ, чтобы убедиться, что он вращается, и он не должен заменять текущий файл, а скорее копировать и затем обрезать. Я пробовал это и похоже, что при каждом повороте у меня есть повернутый файл, добавляемый к содержимому более старого файла, а также размеры журнала не уменьшаются, что противоречит ожидаемым результатам.

Input Command: cat /etc/logrotate.d/mylogrotatefile 
/var/log/.../taskmanager.out {    
    missingok
    rotate 0
    size 50M
    copytruncate
}
Input Command: du * -sh
4.0K    taskmanager.err
16M taskmanager.out
Input Command: logrotate --debug /etc/logrotate.d/mylogrotatefile 
reading config file /etc/logrotate.d/mylogrotatefile
reading config info for /var/log/....0057_01_000002/taskmanager.out 
Handling 1 logs
rotating pattern: /var/log/....0057_01_000002/taskmanager.out  52428800 bytes (no old logs will be kept)
empty log files are rotated, old logs are removed
considering log /var/log/....0057_01_000002/taskmanager.out
  log does not need rotating
Input Command: du * -sh
4.0K    taskmanager.err
32M taskmanager.out

Через некоторое время, когда размер файла достиг 50 МБ, поведение завершается неожиданно.

Input Command: du * -sh
4.0K    taskmanager.err
81M taskmanager.out

Input Command: ls -ls
total 82948
    4 -rw-r--r-- 1 yarn yarn      698 Apr 15 20:07 taskmanager.err
82944 -rw-r--r-- 1 yarn yarn 52432238 Apr 15 20:32 taskmanager.out
Input Command: logrotate -d /etc/logrotate.d/mylogrotatefile 
reading config file /etc/logrotate.d/mylogrotatefile
reading config info for /var/log/....0057_01_000002/taskmanager.out 

Handling 1 logs

rotating pattern: /var/log/....0057_01_000002/taskmanager.out  52428800 bytes (no old logs will be kept)
empty log files are rotated, old logs are removed
considering log /var/log/....0057_01_000002/taskmanager.out
  log needs rotating
rotating log /var/log/....0057_01_000002/taskmanager.out, log->rotateCount is 0
dateext suffix '-20200415'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/....0057_01_000002/taskmanager.out.1 to /var/log/....0057_01_000002/taskmanager.out.2 (rotatecount 1, logstart 1, i 1), 
renaming /var/log/....0057_01_000002/taskmanager.out.0 to /var/log/....0057_01_000002/taskmanager.out.1 (rotatecount 1, logstart 1, i 0), 
copying /var/log/....0057_01_000002/taskmanager.out to /var/log/....0057_01_000002/taskmanager.out.1
truncating /var/log/....0057_01_000002/taskmanager.out
removing old log /var/log/....0057_01_000002/taskmanager.out.2
Input Command:  logrotate  /etc/logrotate.d/mylogrotatefile 
input: ls -ls
total 54088
    4 -rw-r--r-- 1 yarn yarn      698 Apr 15 20:07 taskmanager.err
   96 -rw-r--r-- 1 yarn yarn 55344534 Apr 15 20:34 taskmanager.out
53988 -rw-r--r-- 1 yarn yarn 55282411 Apr 15 20:34 taskmanager.out.1
Input Command: du * -sh
4.0K    taskmanager.err
480K    taskmanager.out
53M taskmanager.out.1

Input Command:  du * -sh
4.0K    taskmanager.err
2.0M    taskmanager.out
53M taskmanager.out.1
Input Command: logrotate -d  /etc/logrotate.d/mylogrotatefile 
reading config file /etc/logrotate.d/mylogrotatefile
reading config info for /var/log/....0057_01_000002/taskmanager.out 

Handling 1 logs

rotating pattern: /var/log/....0057_01_000002/taskmanager.out  52428800 bytes (no old logs will be kept)
empty log files are rotated, old logs are removed
considering log /var/log/....0057_01_000002/taskmanager.out
  log needs rotating
rotating log /var/log/....0057_01_000002/taskmanager.out, log->rotateCount is 0
dateext suffix '-20200415'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/....0057_01_000002/taskmanager.out.1 to /var/log/....0057_01_000002/taskmanager.out.2 (rotatecount 1, logstart 1, i 1), 
renaming /var/log/....0057_01_000002/taskmanager.out.0 to /var/log/....0057_01_000002/taskmanager.out.1 (rotatecount 1, logstart 1, i 0), 
copying /var/log/....0057_01_000002/taskmanager.out to /var/log/....0057_01_000002/taskmanager.out.1
truncating /var/log/....0057_01_000002/taskmanager.out
removing old log /var/log/....0057_01_000002/taskmanager.out.2
Input Command: du * -sh
4.0K    taskmanager.err
8.0M    taskmanager.out
53M taskmanager.out.1

Input Command: logrotate  /etc/logrotate.d/mylogrotatefile 
Input Command: du * -sh
4.0K    taskmanager.err
4.0K    taskmanager.out
58M taskmanager.out.1

Input Command: ls -ls 
total 59912
    4 -rw-r--r-- 1 yarn yarn      698 Apr 15 20:07 taskmanager.err
 1004 -rw-r--r-- 1 yarn yarn 60868154 Apr 15 20:38 taskmanager.out
58904 -rw-r--r-- 1 yarn yarn 60315992 Apr 15 20:38 taskmanager.out.1

Похоже, что при каждом повороте размер фактического файла журнала становится равным 0, а содержимое добавляется в новый файл taskmanager.out. 1 и новый файл никогда не усекается, и со временем он постоянно увеличивается в размере.

Input Command: truncate -s 0 taskmanager.out.1 
input:  du * -sh
4.0K    taskmanager.err
2.0M    taskmanager.out
0   taskmanager.out.1

Теперь еще более удивительно, когда новый файл был усечен с помощью команды truncate:

Input Command: truncate -s 0 taskmanager.out.1
Input Command: logrotate  /etc/logrotate.d/mylogrotatefile 
Input Command:  du * -sh
4.0K    taskmanager.err
80K taskmanager.out
63M taskmanager.out.1

Пожалуйста, исправьте меня, но, насколько я понимаю, новые журналы (taskmanager.out. 1) не должен был прийти к старому размеру, после того, как было запущено усечение с последующим logrotate.

Позже я тоже попробовал это

Input Command:  rm taskmanager.out.1 
Input Command: ls
taskmanager.err  taskmanager.out
Input Command:  du * -sh
4.0K    taskmanager.err
2.0M    taskmanager.out

Input Command: logrotate  /etc/logrotate.d/mylogrotatefile 
Input Command: du * -sh
4.0K    taskmanager.err
112K    taskmanager.out
75M taskmanager.out.1

Я также пробовал разные комбинации minsize, maxsize и rotate 1 в файле logrotate, но ничего не получалось, как ожидалось. Моя версия logrotate

version : logrotate 3.7.8

Я что-то упустил?

...