Почему только некоторые мои журналы становятся повернутыми?

Я использую Ubuntu 14.04. У меня есть следующее в моем/etc/logrotate.conf файле...

/home/rails/myproject/log {
        daily
        rotate 3
        compress
        delaycompress
        missingok
        notifempty
        create 644 rails rails
}

/var/log/postgresql {
        daily
        rotate 3
        compress
        delaycompress
        missingok
        notifempty
        create 644 root root
}

Каждую ночь я посмотрел бы на свои журналы направляющих, и это всегда будет больше - т.е. не казалось, что журналы становились повернутыми...

myuser@myproject:~$ ls -al /home/rails/myproject/log
total 4574368
drwxr-xr-x  2 rails rails       4096 May 30 12:04 .
drwxr-xr-x 15 rails rails       4096 May 30 12:03 ..
-rw-rw-r--  1 rails rails      14960 Jun  1 22:39 development.log
-rw-rw-r--  1 rails rails          0 Oct 22  2016 .keep
-rw-r--r--  1 rails rails 4523480004 Jun 22 10:19 production.log
-rw-rw-r--  1 rails rails  156358087 Jun 22 10:19 sidekiq.log
-rw-rw-r--  1 rails rails      54246 Apr 10 14:34 test.log

Когда я выполняю команду вручную, я вижу, что некоторые журналы, кажется, повернуты...

myuser@myproject:~$ sudo logrotate /etc/logrotate.conf
myuser@myproject:~$ ls -al /home/rails/myproject/log
total 4570288
drwxr-xr-x  2 rails rails       4096 Jun 22 10:22 .
drwxr-xr-x 15 rails rails       4096 May 30 12:03 ..
-rw-rw-r--  1 rails rails          0 Jun 22 10:22 development.log
-rw-rw-r--  1 rails rails      14960 Jun  1 22:39 development.log.1
-rw-rw-r--  1 rails rails          0 Oct 22  2016 .keep
-rw-r--r--  1 rails rails          0 Jun 22 10:22 production.log
-rw-r--r--  1 rails rails 4523505906 Jun 22 10:23 production.log.1
-rw-rw-r--  1 rails rails  156369048 Jun 22 10:23 sidekiq.log
-rw-rw-r--  1 rails rails      54246 Apr 10 14:34 test.log

Как я выясняю, почему мои журналы направляющих не повернуты ночью? Обратите внимание, что другой входит в систему, кажется. Выше, я включал свою конфигурацию пост-ГРЭС, и когда я смотрю на журналы там, кажется, вращаюсь обычно...

myuser@myproject:~$ ls -al /var/log/postgresql
total 1832
drwxrwxr-t  2 root     postgres    4096 May  2 20:42 .
drwxr-xr-x 13 root     root        4096 Jun 22 10:22 ..
-rw-r-----  1 postgres adm      1861361 Jun 22 10:14 postgresql-9.6-main.log

Спасибо, - Dave

Править: Помещение конфигурации в отдельном файле, казалось, ничего не сделало. Ниже моя конфигурация и также журналы, которые, казалось, не были повернуты...

myuser@myapp:~$ sudo cat /etc/logrotate.d/myapp
[sudo] password for myuser:
/home/rails/myapp/log/*.log {
   daily
   missingok
   compress
   notifempty
   rotate 12
   create
   delaycompress
   missingok
   su rails rails
}

Вот журналы. Не появляется что-либо произошло...

myuser@myapp:~$ ls -al /home/rails/myapp/log
total 4635956
drwxr-xr-x  2 rails rails       4096 Jun 22 10:22 .
drwxr-xr-x 15 rails rails       4096 May 30 12:03 ..
-rw-rw-r--  1 rails rails          0 Jun 22 10:22 development.log
-rw-rw-r--  1 rails rails      14960 Jun  1 22:39 development.log.1
-rw-rw-r--  1 rails rails          0 Oct 22  2016 .keep
-rw-r--r--  1 rails rails          0 Jun 22 10:22 production.log
-rw-r--r--  1 rails rails 4546785231 Jun 24 12:12 production.log.1
-rw-rw-r--  1 rails rails  200336693 Jun 24 12:51 sidekiq.log
-rw-rw-r--  1 rails rails      54246 Apr 10 14:34 test.log
4
задан 24 June 2017 в 19:56

3 ответа

Задание Logrotate состоит в том, чтобы переместиться (переименовывают), и сжатие, файлы. Вы настроили его в этом случае, чтобы переименовать и сжать файлы журнала направляющих, затем создаете новые с настоящими именами.

Имена файлов являются способом найти файл, но фактический файл является просто некоторым пространством на диске. Файл может иметь несколько имен (жесткие ссылки) или никакие имена (Вы можете rm файл это открыто, но он все еще занимает место на диске пока файл, открыт в некотором процессе).

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

Необходимо убедить это закрыть и вновь открыть файлы журнала, с помощью их имен снова, подразумевая, что это начинает писать в новые пустые, которые теперь имеют имя, которое раньше имели старые.

Если Вы взглянули в /etc/logrotate.d Вы будете видеть много примеров этого, завися, что Вы установили.

Например, rsyslog имеет:

postrotate
    invoke-rc.d rsyslog rotate > /dev/null
endscript

stunnel имеет:

postrotate
    /etc/init.d/stunnel4 reopen-logs > /dev/null
endscript

Это сценарии, чтобы сказать соответствующему процессу, что файлу нужно повторное открытие. Определенный механизм зависит от программы, но что это имеет тенденцию делать, отправляет a HUP (или иногда USR1) (см. man 7 signal), который продолжительные процессы берут в качестве инструкции закрыть и вновь открыть файлы журнала.

В случае направляющих способ сделать это варьируется, в зависимости от какого регистратора Вы используете. Я только что видел некоторый совет предложить, чтобы Вы использовали copytruncate который является в основном "опцией обмана" в logrotate сообщение этого вручную скопировать содержание и освободить файл вместо того, чтобы переместить его и сделать новый. (см. man logrotate.conf). Это используется вместо create как так:

/home/rails/myapp/log/*.log {
    daily
    missingok
    compress
    notifempty
    rotate 12
    copytruncate
    delaycompress
    missingok
    su rails rails
}

Это не отличное решение, поскольку оно буквально копирует целый файл (для создания снимка его, как это) прежде, чем удалить его содержание, который довольно неэффективен.

Однако при использовании Единорога для запущения приложения (который мультиплексирует запросы через набор идентичных рабочих процессов направляющих), это поддерживает сигнал USR1 как нормальный (уничтожение и замена всех рабочих, эффективно заставляя их вновь открыть файлы), и можно просто представить его постповорачивать использование pkill или подобный, возможно, как это:

/home/rails/myapp/log/*.log {
    daily
    missingok
    compress
    notifempty
    rotate 12
    create
    delaycompress
    missingok
    su rails rails
    postrotate
        pkill -USR1 -u rails unicorn
    endscript
}

pkill инструмент должен искать рабочие процессы и отправить им сигналы, таким образом, это нашло бы все с именем unicorn выполнение как rails пользователь и отправляет его USR1 сигнал, который говорит этому вновь открыть файлы журнала. (Примеры я дал от пакетов Ubuntu /etc/logrotate.d файлы на самом деле делают то же самое, но те сервисы имеют поиск, скрытый в функциях в их /etc/init.d сценарии.)

Я уверен, что будет некоторый способ настроить разумное postrotate поскольку любые направляющие устанавливают, Вы имеете (в худшем и самом легком случае, просто перезапустите его), но надо надеяться который объясняет сторону Ubuntu вещей так или иначе...

0
ответ дан 1 December 2019 в 10:34

Похоже, что проблема сводится к Вам указывающий каталог для вращения файла вместо фактических имен файлов. Конфигурационные файлы для logrotate принимают подстановочные знаки для globbing (сопоставление с образцом).

Для вращения всех файлов с .log расширение в Вашем /home/rails/myproject/log каталог Вы могли использовать следующую строку вместо первой строки Вашей конфигурации:

/home/rails/myproject/log/*.log {

и так же в конфигурации каталога пост-ГРЭС

/var/log/postgresql/*.log {

возможно использовать * подстановочный знак без .log расширение, повернуть все файлы (кроме скрытых, запускающихся с .) в Вашем postgresql каталоге, но я предпочитаю добавленное управление определения .log файлы только:

/var/log/postgresql/* {

Как примечание стороны, знать, как Вы создаете новые версии файла журнала с logrotate, если Вы создаете новый журнал postgresql с 644 восьмеричными полномочиями, принадлежавшими полностью пользователь, затем пользователь пост-ГРЭС не сможет записать в новый файл журнала.

1
ответ дан 1 December 2019 в 10:34

Проверьте состояние в /var/lib/logrotate/status при показе любых проблем

, проверьте полномочия и владение файлов в корневом владельце/etc/logrotate.d и режиме разрешения 644. фрагмент кода для logrotate:

/home/rails/myapp/log/*.log {
   rotate 12
   daily
   missingok
   compress
   notifempty
   create 640 rails rails
   delaycompress
   missingok
}

действительно проверяют logrotate, произведенный ручным выполнением с --verbose, Если Вы требуете logrotation для больше, чем spefici размер, можно экспериментировать с maxsize и size опции в logrotate файле конфигурации

0
ответ дан 1 December 2019 в 10:34

Другие вопросы по тегам:

Похожие вопросы: