Я использую 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
Задание 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 вещей так или иначе...
Похоже, что проблема сводится к Вам указывающий каталог для вращения файла вместо фактических имен файлов. Конфигурационные файлы для 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 восьмеричными полномочиями, принадлежавшими полностью пользователь, затем пользователь пост-ГРЭС не сможет записать в новый файл журнала.
Проверьте состояние в /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 файле конфигурации