Назад | Перейти на главную страницу

Ошибка с gunzip во время logrotate

Я использую logrotate для ротации журналов Symfony2 на моем веб-сервере.
Все работает нормально, но я хотел, чтобы старые журналы присылали мне по электронной почте.
Итак, я добавил строку в свой файл конфигурации logrotate, как вы можете видеть ниже.

Конфигурация Logrotate

/var/www/symfony/app/logs/prod.log {
        daily
        missingok
        rotate 5
        compress
        notifempty
        mail myemail@example.com
        su www-data www-data
}

Теперь я получаю электронные письма, но их содержание не совсем то, что я ожидал.

Письмо получено

/etc/cron.daily/logrotate:
ошибка: не удалось выполнить команду почты для /var/www/symfony/app/logs/prod.log.6.gz
ошибка: команда uncompress не прошла рассылку /var/www/symfony/app/logs/prod.log.6.gz
run-parts: /etc/cron.daily/logrotate завершен с кодом возврата 1

Я много раз искал эту ошибку, но не нашел ничего полезного. Я запустил strace в надежде разобраться в проблеме, но это не сработало, как ожидалось.

Команда Strace

strace -f -o ./strace.txt logrotate -d /etc/logrotate.d/symfony2

Сгенерированный файл довольно большой, но я думаю, что самая интересная часть заключается в следующем

Выходной сигнал Strace

6842 execve ("/ usr / bin / mail", ["/ usr / bin / mail", "-s", "/ var / www / symfony / app / logs / prod." ..., "myemail @ example .com "], [/ * 18 vars /]
6841 <... setgid возобновлен>) = 0
6842 <... execve возобновлено>) = -1 ENOENT (Нет такого файла или каталога)
6841 setuid (0) = 0
6841 execve ("/ bin / gunzip", ["/ bin / gunzip"], [/
18 варов * /]
6842 exit_group (1) =?
6841 <... execve возобновлено>) = 0
6842 +++ завершился с 1 +++
6841 brk (0
6840 <... ожидание4 возобновлено> [{WIFEXITED (s) && WEXITSTATUS (s) == 1}], 0, NULL) = 6842
6841 <... brk возобновлено>) = 0x85f010
6840 --- SIGCHLD {si_signo = SIGCHLD, si_code = CLD_EXITED, si_pid = 6842, si_uid = 0, si_status = 1, si_utime = 0, si_stime = 0} ---
6840 запись (2, "ошибка:", 7
6841 доступ ("/ etc / ld.so.nohwcap", F_OK
6840 <... запись возобновлена>) = 7
6841 <... доступ возобновлен>) = -1 ENOENT (Нет такого файла или каталога)
6840 write (2, "Ошибка почтовой команды для / var / www" ..., 65

Как видите, команда gunzip завершается с кодом ошибки 1 и очень явным вопросительным знаком (?), Чтобы помочь мне лучше понять, что происходит. Единственная ошибка, которую я получаю, - это «Нет такого файла или каталога», что я считаю очень странным, потому что logrotate должен обрабатывать ротацию файлов перед отправкой электронных писем.

Мой вопрос, как решить эту проблему с помощью gunzip / logrotate, чтобы получить повернутый файл журнала по электронной почте до его удаления?

Вот некоторая информация о моем сервере, которая может иметь отношение к проблеме

корень @ someServer: / home / someUser # cat / etc / debian_version
8.1
корень @ someServer: / home / someUser # logrotate --version
logrotate 3.8.7
корень @ someServer: / home / someUser # gzip --version
gzip 1.6

Кроме того, мои файлы журналов довольно маленькие (~ 300-400 байт), и если я использую gunzip вручную, он работает нормально.


Изменить - добавление вывода logrotate

Обработка 1 журнала

шаблон вращения: /var/www/symfony/app/logs/prod.log принудительно из командной строки (5 поворотов)
пустые файлы журналов не меняются, старые журналы отправляются на адрес someEmail@example.com
переключение euid на 1000 и egid на 33
учитывая журнал /var/www/symfony/app/logs/prod.log
бревно нужно повернуть
ротация журнала /var/www/symfony/app/logs/prod.log, log-> rotateCount равно 5
суффикс dateext '-2016011811'
шаблон glob '- [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [ 0-9] '
переименование /var/www/symfony/app/logs/prod.log.5.gz в /var/www/symfony/app/logs/prod.log.6.gz (rotatecount 5, logstart 1, i 5),
переименование /var/www/symfony/app/logs/prod.log.4.gz в /var/www/symfony/app/logs/prod.log.5.gz (rotatecount 5, logstart 1, i 4),
переименование /var/www/symfony/app/logs/prod.log.3.gz в /var/www/symfony/app/logs/prod.log.4.gz (rotatecount 5, logstart 1, i 3),
переименование /var/www/symfony/app/logs/prod.log.2.gz в /var/www/symfony/app/logs/prod.log.3.gz (rotatecount 5, logstart 1, i 2),
переименование /var/www/symfony/app/logs/prod.log.1.gz в /var/www/symfony/app/logs/prod.log.2.gz (rotatecount 5, logstart 1, i 1),
переименование /var/www/symfony/app/logs/prod.log.0.gz в /var/www/symfony/app/logs/prod.log.1.gz (rotatecount 5, logstart 1, i 0),
старый журнал /var/www/symfony/app/logs/prod.log.0.gz не существует
переименование /var/www/symfony/app/logs/prod.log в /var/www/symfony/app/logs/prod.log.1
сжатие журнала с помощью: / bin / gzip
переключение uid на 1000 и gid на 33
переключение uid на 1000 и gid на 33
переключение euid на 0 и egid на 0
ошибка: не удалось выполнить команду почты для /var/www/symfony/app/logs/prod.log.6.gz
ошибка: команда uncompress не прошла рассылку /var/www/symfony/app/logs/prod.log.6.gz
переключение euid на 0 и egid на 0

Полная версия ниже:

 strace -vf -s 128 -e verbose=all -o ./strace.txt logrotate -d /etc/logrotate.d/symfony2

http://pastebin.com/C0uj0419

Согласно вашему strace, ваша проблема на самом деле не в gzip.

Вот почему gzip не работает.

14972 write(1, "<Here is the content of my prod.log file>"..., 32768) = -1 EPIPE (Broken pipe)

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

14973 execve("/usr/bin/mail", ["/usr/bin/mail", "-s", "/var/www/symfony/app/logs/prod.log", "someUser@example.com"], ["SHELL=/bin/bash", "TERM=xterm", "USER=root", "LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41"..., "SUDO_USER=none", "SUDO_UID=1000", "USERNAME=root", "MAIL=/var/mail/root", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "PWD=/home/none", "LANG=en_GB.UTF-8", "SHLVL=1", "SUDO_COMMAND=/bin/bash", "HOME=/root", "LANGUAGE=en_GB:en", "LOGNAME=root", "SUDO_GID=1000", "_=/usr/bin/strace"] <unfinished ...>
14973 <... execve resumed> )            = -1 ENOENT (No such file or directory)

Когда вы пытаетесь выполнить почтовую команду, она терпит неудачу, потому что /usr/bin/mail не существует. Программа выходит, stdout из gzip возвращается SIGPIPE поскольку другой конец трубы исчез. Таким образом, gzip завершается с 1.

Что вам нужно сделать, так это установить mail команда. Это, наверное, тоже bsd-mailx в системах debianesque или mailx на базе Redhat.

Использовать prerotate или postrotate скрипт для отправки логов самостоятельно. Это дает вам возможность отправлять журналы в виде сжатого вложения, если хотите, или распаковывать их.

Есть количество вариантов отправки вложений из CLI.