# Логирование

## Описание

* За формирование логов отвечает системный демон rsyslogd
  * Все логи записываются в var/log
* С выпуском RHEL 7 за все системные процессы стал отвечать systemd
  * Логирование стало осуществляться за счет демона systemd-journald
  * systemd-journald концентрирует все сообщения, которые генерируются слуажбами systemd
  * Логи при этом записываются в /dev/log
  * Доступ к логам осуществляется через journalctl
  * /dev/log также связан с rsyslogd, который контролирует запись этих логов и в /var/log
  * journalctl работает только с systemd-journald, соответственно чтобы через него получать доступ к логам, необходимо для journald сформировать свой таргет логирования - /var/log/journal

## Описание rsyslog

* Для работы rsyslog необходим активный сервис rsyslogd
* Главный конфигурационный файл хранится в /etc/rsyslog.conf

```
<....>
#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*
<....>
```

* Snap-in файлы могут располагаться в /etc/rsyslog.d/
* Каждая строка логгера содерит следущие значения:
  * facility - объект, для которого сформирован лог
  * severity - уровень важности, с которого должно быть осуществлено логирование
  * destination - назначение, в которое необходимо записать лог
* Логи как правило записываются в /var/log
  * команда logger записывает в rsyslog команды вручную

**Описание facility:**

* **rsyslog** имеет (и должен иметь) обратную совместимость с архаичным syslog сервисом
* В syslog определено фиксированное число объектов (kern, authpriv, cron и др.)
* Для сервисов, у которых неопределены объекты, может использоваться local facility
* Из-за ограниченности типов объектов, некоторые службы пишут логи сами, не используя rsyslog

## Systemd-journald

* Systemd-journald  - служба логирования, являющаяся частью systemd
  * Интегрирована с systemctl status \<unit> (показывает последние сообщения лога в выводе статуса)
* Для работы с systemd-journald используется команда journalctl
* Сообщения записываются также и в rsyslog с использованием модуля imjournal для rsyslog
* Для того, чтобы systemd-journald сохранял логи после перезагрузки необходимо создать ему директорию /var/log/journal
* Конфигурация хранится в /etc/systemd/journald.conf
* Вывод лога за службу

```
[admin@centos8 ~]$ journalctl UNIT=sshd
-- Logs begin at Fri 2020-02-14 20:35:33 MSK, end at Sat 2020-03-14 17:49:25 MSK. --
-- No entries --
```

## Сохранение логов journald

* По-умолчанию журнал записывается в /run/log/journal, который автоматически очищается при перезагрузке
* Для изменения правила поведения при перезагрузке необходимо изменить настройки /etc/systemd/journald.conf
  * Изменить необходимо параметр Storage
    * persistent - переключит сохранение логов в /var/log/journal, если директория не создана - создаст
    * volatile - сохранение логов только в /run/log/journal
    * auto - сохраняет в /var/log/journal, если директория есть,  если ее нет  - в /run/log/journal
* Лог перезаписывается каждый месяц
* Журнал логов не может занимать больше 10% пространства системы
* И также логирование останавливается, если осталось менее 15% места в системе
  * Эти настройки также могут быть изменены через /etc/systemd/journald.conf

## Logrotate

* Logrotate позволяет избежать переполнения системы логами
* Запускается через cron.daily
* Основные настройки хранятся в /etc/logrotate.conf, snap-in могут быть в /etc/logrotate.d/
* По умолчанию:
  * файлы логов обнуляются еженедельно
  * логи хранятся не более, чем за 4 недели
  * после удаление лога, создается новый файл, старый переименовывается с префиксом dataext

```
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# system-specific logs may be also be configured here.
```
