Я использую 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 вручную, он работает нормально.
Обработка 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
Согласно вашему 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
скрипт для отправки логов самостоятельно. Это дает вам возможность отправлять журналы в виде сжатого вложения, если хотите, или распаковывать их.