Логи в Linux

Расположение логов

Log - файлы расположены в каталоге
/var/log
служба rsyslog сортирует syslog-сообщения по типу (или источнику), приоритету и записывает их в файлы в этом каталоге.

Служба systemd-journald собирает сообщения от ядра, ранних стадий процесса загрузки, стандартного потока вывода и ошибок в ходе запуска системных служб и их работы, а так же события от syslog.

    Системные лог файлы:
  • /var/log/messages - большинство сообщений syslog, кроме сообщений аутентификации, обработки электронной почты, периодическими задачами, сообщений отладки;
  • /var/log/secure - сообщения и ошибки, связанные с безопасностью и аутентификацией;
  • /var/log/maillog - сообщения работы почтового сервиса;
  • /var/log/cron - сообщения связанные с периодически выполняемыми задачами;
  • /var/log/boot.log - журнал запуска системы.
  • Журнал SELinux по умолчанию записывается процессом auditd в файл /var/log/audit/audit.log. Если этот процесс не запущен, то SELinux ведет журнал в файле /var/log/messages, в этом случае все сообщения системы контроля доступа маркируются ключом AVC, что позволяет быстро отфильтровать нужные строки.

Приоритеты syslog-файлов

Код Приоритет Уровень серьёзности
0 emerg систему невозможно использовать
1 alert необходимо немедленно принять меры
2 crit критическое состояние
3 err некритичные состояния ошибки
4 warning предупреждение
5 notice обычные сообщение повышенной важности
6 info информационное сообщение
7 debug отладочное сообщение

Служба rsyslogd

Служба rsyslogd использует источник и приоритет сообщений журнала для определения способа обработки поступающий сообщений. Это определяется в файлах
/etc/rsyslog.conf
/etc/rsyslog.d/*.conf
Свои настройки нужно размещать в каталоге /etc/rsyslog.d в *.conf файлах чтобы они не были перезаписаны при обновлении службы (основной конфигурационный файл будет перезаписан).
Раздел RULES содержит директивы, определяющие место сохранения сообщений, указывается в виде
<источник> . <приоритет> <место>
Чтобы игнорировать сообщения от какого-либо источника, нужно установить его в "none".

Ротация log-файлов

Служба logrotate осуществляет ротацию log-файлов.

    Шаги ротации:
  1. log-файл переименовывается, при этом в название добавляется дата ротации;
  2. создается новый пустой файл с исходным названием;
  3. уведомляется служба, осуществляется запись в log-файл;
  4. через несколько ротаций (обычно 4), старый файл удаляется.
Файлы конфигурации logrotate
/etc/logrotate.conf
/etc/logrotate.d/*
/etc/logrotate.d/syslog
Запуск осуществляет cron с помощью
/etc/cron.daily/logrotate

logger

Команда logger может отправлять сообщения службе rsyslogd.

По умолчанию сообщения отправляются с источником user и приоритетом notice, если не указано иное с помощью ключа -p
logger -p local17.notice "Test event"
Настройка своего лога для сохранения всех сообщений с приоритетом debug в log-файл
touch /var/log/messages-debug
echo "*.debug /var/log/messages-debug" > /etc/rsyslog.d/messages-debug.conf
systemctl restart rsyslog
logger -p user.debug "Test event"
cat /var/log/messages-debug

Journald

Журнал событий systemd - события в виде структурированного и индексированного двоичного файла, по умолчанию в /run/log, после перезагрузки файл создается заново. Для чтения лога используется journalctl.

  • journalctl просмотр записей журнала systemd. Без ключей сообщения выводятся со времени загрузки
  • journalctl -xe понятный вывод
  • journalctl -p err выбор сообщений с приоритетом error и выше
  • journalctl -p notice выбор сообщений с приоритетом notice и выше
  • journalctl -p notice выбор сообщений с приоритетом notice и выше
  • journalctl -p warning выбор сообщений с приоритетом warning и выше
  • journalctl -n вывод последних 10 записей
  • journalctl -n 5 вывод последних 5 записей
  • journalctl -f непрерывный вывод
  • journalctl --since today вывод записей зарегистрированных сегодня
  • journalctl -since "2019-11-20 20:30:00" -until "2019-11-21 20:30:00" вывод записей из указанного диапазона даты и времени
  • journalctl -since "19:30:00" -until "20:30:00" вывод записей из указанного диапазона времени
  • journalctl -since 'date +%T -d "-10 mins"' вывод записей за последние 10 минут
  • journalctl -since 9:00:00 _SYSTEMD_UNIT="sshd.sevice" вывод записей от службы sshd, записанные с 9 утра сегодня
  • journalctl -o verbose детальный вывод данных
  • journalctl _SYSTEMD_UNIT=sshd.service вывод записей журнала, связанных с сервисом sshd
  • journalctl _EXE=/usr/sbin/NetworkManager просмотр журнала процесса, запущенного по пути /usr/sbin/NetworkManager
  • journalctl -o verbose _PID=<pid> просмотр подробного журнала по процессу, для которого указан id
  • journalctl _PID=1 вывести только сообщения от процесса systemd
  • journalctl _UID=1000 вывод сообщений созданных службой, запущенной от пользователя с uid=1000
  • journalctl -b вывод журнала с последней загрузки
  • journalctl -b -1 вывод журнала предыдущей загрузки
По умолчанию журнал хранится в
/run/log/journal
Если существует каталог
/var/log/journal
журнал будет сохранятся и после перезагрузки
Журнал использует встроенный механизм ротации, который запускается каждый месяц. Размер журнала не может быть больше 10% размера файловой системы, в которой он находится. Эти параметры видно в выводе команды
journalctl | head -2
Создание каталога /var/log/journal
mkdir /var/log/journal
chown root:systemd-journal /var/log/journal
chmod 2755 /var/log/journal
Для применения изменений нужно перезагрузить систему или отправить сигнал
killall -USR1 systemd-journald
Так как теперь журнал сохраняется после перезагрузки, чтобы уменьшить объем вывода и посмотреть сообщения с момента последней перезагрузки можно добавить ключ -b
journalctl -b
можно ограничить вывод сообщениями предыдущей загрузки
journalctl -b -1