Как получить системный модуль для перенаправления или копирования журналов в системный журнал?
Я использую Ubuntu 16.04 Server со службой node.js, где мне нужно записать журнал в файл, как старый добрый системный журнал:)
Я гуглил пол ночи, но ничего не вышло.
Причина этой странной необходимости заключается в том, что мы собираем журналы с помощью filebeat и отправляем их в кластер ElasticSearch.
1 ответ
Нашел обходной путь с помощью systemd для запуска journalctl сразу после запуска службы, из которой мне нужно получить журнал.
Добавьте сценарий службы systemd для создания файла журнала для "MyService" /etc/systemd/system/multi-user.target.wants/MyService-journalctl-to-log.service
:
[Unit]
Description=MyService journalctl parser to filebeat
#I needed to get a log file for filebeat to read
#Wants=filebeat.service
#After=filebeat.service
[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sh -c '/bin/journalctl --no-tail -f -u MyService.service > /var/log/MyService.log 2>&1'
ExecStartPre=/bin/journalctl --vacuum-size=10M
[Install]
WantedBy=multi-user.target
Включить и запустить новый сервис systemd
systemctl enable MyService-journalctl-to-log.service
systemctl start MyService-journalctl-to-log.service
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Если какой-либо из каталогов ошибочен, сообщите мне или отредактируйте его самостоятельно, если сможете. Я пишу это с макушки.
Я знаю, что это старая версия, но если ваша версия SystemD достаточно современная, вы можете использовать ее в своих интересах. Вы можете позволить уже существующим службам и расписаниям ОС делать то, для чего они нужны. Ваш юнит-файл может сообщить демону, что вывод должен перемещаться в системный журнал (man systemd.exec
)
[Unit]
Description=...
[Service]
WorkingDirectory=...
User=...
Group=...
StandardOutput=syslog
StandardError=inherit
SyslogIdentifier=<program-name>
SyslogFacility=local4 # just because... choose your own
ExecStart=... your command
[Install]
WantedBy=multi-user.target
Поместите файл в
/usr/local/lib/systemd/system/
чтобы вы не смешивали свои файлы модулей с другими сопровождающими пакетов (man systemd.unit
Я думаю)
Не забудьте сообщить SystemD, что этот модуль доступен (или модифицирован):
sudo systemctl daemon-reload
Это добавит ваш файл модуля в
multi-user.target
каталог.
Теперь, когда ваш вывод направлен в rsyslog, пора сообщить rsyslogd, что с ним делать. Заполнить
/etc/rsyslog.conf.d/10-<your-program-name>.conf
со следующими инструкциями
if ($programname == "<your-programname>") then {
action(
type="omfile"
FileOwner="syslog"
FileGroup="adm"
File="/var/log/<programname>/<programname>.log"
FileCreateMode="0644"
)
stop
}
если вам не хватает каких-либо каталогов, создайте их. Не забудьте указать правильные права собственности и разрешения. Каталоги журналов можно настроить для
syslog:adm
.
Перезапустите rsyslogd, чтобы он принял конфигурацию.
Но мы еще не закончили. Файл будет расти без остановки. Настроить
logrotate
так что вы можете позволить своим журналам вращаться. Поместите следующую конфигурацию в
/etc/logrotate.conf.d/<programname>
/var/log/<programname>
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
}
Это всего лишь базовая настройка. Внесите свои собственные личные настройки (есть много страниц руководства, которые нужно прочитать). Службы logrotate нет, это просто запланированная задача, которая обычно запускается каждый день (не помню, cron или anacron).
Остерегайтесь, если ваши журналы растут слишком быстро за один день. Если вы хотите, чтобы logrotate выполнялся по-другому (например, в зависимости от размера), необходимо сделать что-то еще.