# Практическая работа. Система syslog и журналы логов.
## Цель работы:
- научиться работать с журналированием в Linux
- научится создавать правила для демона
- познакомиться с автоматической ротацией
## Теория
Начнём издалека. Работая, система отслеживает и записывает в специальные файлы события, которые считает важными или нужными (например, для исправления и отладки ошибок и сбойных конфигураций). Эти файлы называются **лог-файлами** (файлы регистрации / журнальные файлы). Други словами, эти файлы (далее “**логи**”) являются основным источником информации о работе системы и происходящих ошибках. Сбор и отслеживание логов осущесвтляется демонами событий. Главной системой логирования считается syslog и ее демон syslogd (в новых дистрибутивах, включая Debian 11, система rsyslog и демон rsyslogd).
Описанный выше процесс, т.е. **журналирование**, может осуществляться на локальной системе, а так же сообщения журналирования могут пересылаться на удаленную систему.
:::info
**Для правильной фиксации времени логов, необходимо настроить его синхронизацию.**
*Сначала задаем правильный часовой пояс:*
==\cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime==
*в данном примере мы использовали московское время*.
++Затем устанавливаем и запускаем chrony.++
**а) на системе CentOS / Red Hat:**
==yum install chrony==
==systemctl enable chronyd==
==systemctl start chronyd==
**б) на системе Ubuntu / Debian:**
==apt-get install chrony==
==systemctl enable chrony==
==systemctl start chrony==
:::
## 1. Знакомство с конфигурационным файлом rsyslog.conf.
Файл **rsyslog.conf** является главным конфигурационным файлом журналирования системы. Файл представляет собой набор правил работы демона.
`nano /etc/rsyslog.conf`

#### 1.1 Синтаксис правила.
` *источник.приоритет действие* `
Две и более конструкции разделяются ";", после идёт действие (куда записывать/отправлять?). Символ "*" обозначает "все/любой".
#### 1.2 Создание правила для отправки всех событий user на удалённую систему. (клиент)
`user.* @адрес_машины"`

Далее перезапускаем демона.
`service rsyslog restart`
Или же:
`systemctl restart rsyslog`
:::success
**Все логи:**
:::
Для начала можно настроить отправку всех логов на сервер. Создаем конфигурационный файл для rsyslog:
`vi /etc/rsyslog.d/all.conf`
**Добавляем:**
`*.* @@192.168.0.15:514`
* где 192.168.0.15 — IP-адрес сервера логов. *.* — перенаправлять любой лог.
**Перезапускаем rsyslog:**
`systemctl restart rsyslog`
:::success
**Для определенных категорий:**
:::
**Если необходимо отправлять только определенные категории логов, создаем конфигурационный файл для соответствующей, например:**
`vi /etc/rsyslog.d/kern.conf`
**Добавим строку:**
`kern.* @@192.168.0.15:514`
**Перезапускаем сервис логов:**
`systemctl restart rsyslog`
Возможные категории для логов (facility):
**Категории и Описание**
* kern Сообщения, отправляемые ядром
* user Пользовательские программы
* mail Почта
* daemon Сервисы (демоны)
* auth Безопасность/вход в систему/аутентификация
* syslog Сообщения от syslog
* lpr Логи печати
* news Новостные группы (usenet)
* uucp Unix-to-Unix CoPy (копирование файлов между компьютерами)
* cron Планировщик заданий
* authpriv Безопасность/вход в систему/аутентификация - защищенный режим
* ftp Логи при передачи данных по FTP
* ntp Лог службы синхронизации времени (существует не везде)
* security, log audit Журнал аудита (существует не везде)
* console, log alert Сообщения, отправляемые в консоль (существует не везде)
* solaris-cron, clock daemon Cron в solaris (существует не везде)
* local0 - local7 Зарезервированы для локального использования. Уровень серьезности определяется числом от 0 до 7.
:::success
**Для определенного уровня:**
:::
**Если мы хотим передавать только сообщения об ошибках, добавляем строку в файл конфигурации rsyslog:**
`vi /etc/rsyslog.d/erors.conf`
`*.err @@192.168.0.15:514`
**Перезапускаем сервис логов:**
`systemctl restart rsyslog`
**Возможные категории для логов (severity):**
:::info
№ Уровень Расшифровка
0 emerg Система не работает (PANIC)
1 alert Серьезная проблема, требующая внимания
2 crit Критическая ошибка
3 err Ошибка (ERROR)
4 warning Предупреждение (WARN)
5 notice Важное информационное сообщение
6 info Информационное сообщение
7 debug Отладочная информация
:::
#### 1.3 Настройка удалённой системы (сервера).
`nano /etc/rsyslog.conf`
Здесь нам необходимо раскомментировать следующие строчки:
```
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")
```

Затем вписываем шаблон хранения входящих журналов.
```
$template remote-incoming-logs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?remote-incoming-logs
```
Файлы журнала будут использовать следующее соглашение об именах:
/% HOSTNAME% / — имя хоста клиентской системы.
/% PROGRAMNAME% / — определяет клиентскую программу, создавшую файл журнала.
Перезапускаем демона.
#### 1.4 Создание события с помощью logger.
**logger** — unix-утилита, предоставляющая командный интерфейс для модуля системного журнала syslog.
`logger -p user.warn *Собщение*`

## 2. Настройка создания резервных копий логов с помощью утилиты logrotate
Утилита **logrotate** предназначена для автоматизации обработки журналов. Она может выполнять с ними необходимые действия в зависимости от определенных условий и правил соответствия. На данный момент эта утилита уже предустановленна на большинстве дистрибутивов, но если у вас её нет, выполните команду `apt install logrotate`.
Все основные настройки программы находятся в файле **/etc/logrotate.conf**.
`nano /etc/logrotate.conf`

Основные директивы управления и обработки логов:
rotate - указывает сколько старых логов нужно хранить, в параметрах передается количество;
create - указывает, что необходимо создать пустой лог файл после перемещения старого;
dateext - добавляет дату ротации перед заголовком старого лога;
compress - указывает, что лог необходимо сжимать;
delaycompress - не сжимать последний и предпоследний журнал;
extension - сохранять оригинальный лог файл после ротации, если у него указанное расширение;
mail - отправлять Email после завершения ротации;
maxage - выполнять ротацию журналов, если они старше, чем указано;
missingok - не выдавать ошибки, если лог файла не существует;
olddir - перемещать старые логи в отдельную папку;
postrotate/endscript - выполнить произвольные команды после ротации;
start - номер, с которого будет начата нумерация старых логов;
size - размер лога, когда он будет перемещен.
#### 2.1 Создание ротации резервной копии журнала
```
/var/log/messages {
rotate 5 //хранить 5 копий
mail logadmin@sysloger //почта для получения самой старой копии
size 100k //размер 100Кб
postrotate //запуск скрипта, перезапускающиего демона
/usr/bin/killall -HUP syslogd //сигнал HUP для перезапуска
endscript //конец скрипта
}
```

То есть, для каждого лога, подлежащего ротации, используется этот шаблон:
```
"адрес файла лога" {
директивы
}
```
## 3.[](https://) Чтение журналов
#### 3.1 Просмотр журналов с помощью cat+less
`cat /var/log/bacula/bacula.log | less`

#### 3.2 Просмотр журналов с помощью tail
`tail -n 40 /etc/log/kern.log`

#### 3.3 Просмотр логов с помощью journalctl
`journalctl -bo`

#### 3.4 Просмотр логов ядра с помощью dmesg
`dmesg`
