В статье рассматривается настройка централизованного сбора логов и графического отображения статистики по ним в веб-интерфейсе с помощью пакетов Rsyslog и Loganalyzer на CentOS 7.
Для настройки использовались две машины:
Сервер – ip 192.168.32.115, клиент – ip 192.168.32.116, hostname — client1.
Настройка сервера
Перед установкой Rsyslog установить пакеты libestr и libee.
cd /usr/src
wget http://libestr.adiscon.com/files/download/libestr-0.1.11.tar.gz
tar xzvf libestr*
cd libestr*
./configure --libdir=/usr/lib --includedir=/usr/include
make
make install
yum install libee
Установка репозитория mysql
wget http://repo.mysql.com/mysql57-community-release-el7.rpm
rpm -ivh mysql57-community-release-el7.rpm
Установка репозитория mysql
wget http://repo.mysql.com/mysql57-community-release-el7.rpm
rpm -ivh mysql57-community-release-el7.rpm
Установка необходимых пакетов.
yum install php-mysql php mysql mysql-server httpd
Добавление в автозагрузку и запуск служб:
chkconfig mysqld on ; chkconfig httpd on
service mysqld start ; service httpd start
Теперь можно установить пакеты rsyslog:
yum install -y rsyslog-mysql rsyslog
Добавляем в автозагрузку rsyslog и запускаем сервис.
chkconfig rsyslog on
service rsyslog start
После установки mysql для того, чтобы найти временный пароль для входа с правами администратора выполнить команду:
grep 'temporary password' /var/log/mysqld.log
Т.к. временный пароль хранится в простом текстовом файле /var/log/mysqld.log, для изменения пароля пользователя root в консоли mysql ввести:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'новый_пароль';
Также, в консоли mysql:
#создание отдельного пользователя для rsyslog - rsyslog
CREATE USER 'rsyslog_user'@'localhost' IDENTIFIED BY 'Pa$$_w0rd';
#создание базы данных и схемы таблиц
CREATE DATABASE rsyslog_db;
USE rsyslog_db;
#создаем таблицы в бд rsyslog_db
CREATE TABLE SystemEvents
(
ID int unsigned not null auto_increment primary key,
CustomerID bigint,
ReceivedAt datetime NULL,
DeviceReportedTime datetime NULL,
Facility smallint NULL,
Priority smallint NULL,
FromHost varchar(60) NULL,
Message text,
NTSeverity int NULL,
Importance int NULL,
EventSource varchar(60),
EventUser varchar(60) NULL,
EventCategory int NULL,
EventID int NULL,
EventBinaryData text NULL,
MaxAvailable int NULL,
CurrUsage int NULL,
MinUsage int NULL,
MaxUsage int NULL,
InfoUnitID int NULL ,
SysLogTag varchar(60),
EventLogType varchar(60),
GenericFileName VarChar(60),
SystemID int NULL
);
CREATE TABLE SystemEventsProperties
(
ID int unsigned not null auto_increment primary key,
SystemEventID int NULL ,
ParamName varchar(255) NULL ,
ParamValue text NULL
);
#предоставить пользователю rsyslog права доступа к базе данных
GRANT ALL PRIVILEGES ON rsyslog_db.* TO rsyslog_user IDENTIFIED BY " Pa$$_w0rd";
flush privileges;
#выход из mysql
exit
Настройка конфигурационного файла /etc/rsyslog.conf.
Открываем файл для редактирования:
vi /etc/rsyslog.conf
#Модули imjournal, imusock раскомментировать
#Rsyslog может работать по UDP (более быстро, но ненадежно) и по TCP (медленнее, надежнее)
#или по обоим протоколам вместе.
#Для работы Rsyslog по UDP раскомментировать в конфигурационном файле строки
$ModLoad imudp
$UDPServerRun 514
#Для TCP
$ModLoad imtcp
$InputTCPServerRun 514
#После них, перед блоком Global Directives – создание шаблона для получения сообщений от
#удаленных хостов.
#Запись сообщений журнала в отдельные файлы, в /var/log/ где файлы будут именоваться на
#основе имени хоста и имени приложения удаленной машины.
$template RemoteLogs,"/var/log/rsyslog/%HOSTNAME%/%PROGRAMNAME%.log"
#Для того чтобы отфильтровать принимаемые сообщения от удаленных хостов нужно указать в
#конфигурационном файле требующиеся источники и уровень.
#[источник].[уровень]? RemoteLogs
#Например, для отправки всех информационных сообщений, от всех процессов кроме почты:
#*.info, mail.none? RemoteLogs
#указываем, что применяем шаблон ко всем полученным логам
*.* ?RemoteLogs
#правило для перенаправления, указывает rsyslog прекратить дальнейшую обработку сообщений,
#а не записывать их локально. Для того, чтобы удаленные сообщения не были записаны дважды.
#Использование & ~ устарело в rsyslogd v7, вместо этого использовать & stop
& stop
#### GLOBAL DIRECTIVES ####
#Конфигурирование пересылки сообщений syslog в БД.
#Загружаем драйвер mysql
$ModLoad ommysql
#Настраиваем пересылку логов. Общий вид источник.категория_лога место_записи(хост, имя базы
#данных, rsyslog-пользователь в mysql, последний параметр – пароль пользователя rsyslog в
#mysql). Для пересылки всех сообщений указать ‘*.*’
*.* :ommysql:127.0.0.1,Syslog,rsyslog,пароль_пользователя_rsyslog_в_mysql
#Категории логов
#№ Уровень Значение
#0 emerg Система не работает (PANIC)
#1 alert Серьезная проблема, требующая внимания
#2 crit Критическая ошибка
#3 err Ошибка (ERROR)
#4 warning Предупреждение (WARN)
#5 notice Важное информационное сообщение
#6 info Информационное сообщение
#7 debug Отладочная информация
#Источник лога.
#№ Название Значение
#0 kern Сообщения, отправляемые ядром
#1 user Пользовательские программы
#2 mail Почта
#3 daemon Сервисы (демоны)
#4 auth Безопасность/вход в систему/аутентификация
#5 syslog Сообщения от syslog
#6 lpr Логи печати
#7 news Новостные группы (usenet)
#8 uucp Unix-to-Unix CoPy (копирование файлов между компьютерами)
#9 cron Планировщик заданий
#10 authpriv Безопасность/вход в систему/аутентификация - защищенный режим
#11 ftp Логи при передачи данных по FTP
#12 ntp Лог службы синхронизации времени (существует не везде)
#13 security, log audit Журнал аудита (существует не везде)
#14 console, log alert Сообщения, отправляемые в консоль (существует не везде)
#15 solaris-cron, clock daemon Cron в solaris (существует не везде)
#16-23 local0 - local7 Для локального использования. Уровень серьезности определяется числом
#от 0 до 7.
#После настроек бд в GLOBAL DIRECTIVES также указываем протокол и подсеть(и), из которой(ых)
#можно принимать логи:
$AllowedSender TCP, 192.168.32.0/24
Чтобы проверить конфигурационный файл rsyslog, запустите: sudo rsyslogd -N1 В случае возникновения проблем, rsyslog будет о них писать в /var/log/messages, либо о них будет указано в выводе команды service rsyslog status.
Далее сохраняем изменения в конфигурационном файле, и перезапускаем rsyslog для применения настроек.
service rsyslog restart
Установка LogAnalyzer
cd /usr/src
wget http://download.adiscon.com/loganalyzer/loganalyzer-4.1.8.tar.gz
tar xzvf loganalyzer-4.1.8.tar.gz
cd loganalyzer-4.1.8/src
Создаем директорию, копируем файлы LogAnalyzer.
mkdir /var/www/html/log
cp -R * /var/www/html/log
cd ../contrib
cp * /var/www/html/log
cd /var/www/html/log
chmod +x configure.sh secure.sh
./configure.sh
Последняя команда создаст пустой файл config.php и предоставит право записи в него. Далее необходимо запустить
ls -l
для проверки создания файла config.php. Настройка через браузер внесет изменения в этот файл.
Создание пользователя и базы данных в mysql:
mysql -u root -p
create database loganalyzer_db;
CREATE USER 'loganalyzer_user'@'localhost' IDENTIFIED BY 'Pa$$_w0rd';
GRANT ALL PRIVILEGES ON loganalyzerdb.* TO loganalyzer_user IDENTIFIED BY "Pa$$_w0rd";
flush privileges;
exit
Дальнейшие настройки производятся в веб. В браузере необходимо перейти по адресу ip_адрес_сервера/log.
Сообщение об отсутствии конфигурационного файла при установке. Сообщение об отсутствии конфигурационного файла при установке.
- Нажать далее (Next)
- Проверка прав на запись для файла config.php
- Настройка базовой конфигурации
- Создание таблиц
- Проверка создания таблиц
- Создание учетной записи для входа в LogAnalyzer
- Создание источника системных сообщений
- Завершение установки
Переходим по ссылке для авторизации и вводим данные ранее созданной учетной записи для входа в LogAnalyzer.
На сервере и клиенте в файерволе также необходимо будет разрешить прохождение udp и tcp трафика по 514 порту, отключить selinux, установить часовой пояс:
timedatectl set-timezone Europe/Kiev
или
rm -rf /etc/localtime ; ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
Синхронизировать время.
yum –y install chrony ; chkconfig chronyd on ; service chronyd start
И проверить установленное время и часовой пояс:
service chronyd status ; chronyc tracking ; date; ls -l /etc/localtime
Настройка клиента
На клиенте также устанавливаем Rsyslog
Для отправки всех логов.
Открываем конфигурационный файл
nano /etc/rsyslog.d/all.conf
Добавляем в конфигурационный файл
*.* @@192.168.32.115:514
#Также изменяем отправку на удаленный сервер логов asterisk. На сервере логи будут храниться в
#отдельном файле /var/log/rsyslog/client1/asterisk.log(вначале на сервере пишутся в
#/var/log/rsyslog/client1/.log ). В параметре Severity указывается уровень важности
#логов (см. табл. выше), File – местоположение логов на клиенте(/var/log/asterisk/full),
#Facility-объект(см. табл. выше)
module(load="imfile" PollingInterval="5")
input(type="imfile"
File="/var/log/asterisk/full"
Tag="asterisk"
Severity="debug"
Facility="local7")
local7.* @@192.168.32.115:514
Символ @ перед IP-адресом значит, что сообщения нужно передавать по UDP. Чтобы использовать вместо этого TCP, введите @@.
Перезапускаем rsyslog
service rsyslog restart
Далее, для того, чтобы логи со временем не занимали на сервере большой объем свободного места, необходимо будет также настроить и ротацию логов.
После авторизации на сервере в веб панели LogAnalyzer отображаются недавние сообщения Rsyslog.
При переходе в пункт меню Statistics — данные отображаются в виде графиков.
В LogAnalyzer можно отфильтровать вывод применив фильтры по колонкам Facility (Обьект), Severity (Серьезность), Host (Хост), Syslogtag (Системный журнал), Messagetype (Тип сообщения) нажав на какое-либо значение-тэг. После нажатия появится контекстное меню Available searches(список фильтров для поиска). Например, для хоста client1:
- Add ‘client1’ to filterset — Добавить ‘client1’ в поле фильтров поиска (доступно, если хотя бы один фильтр поиска был установлен ранее)
- Exclude ‘client1’ from filterset — Исключить ‘client1’ в поле фильтров поиска (доступно, если хотя бы один фильтр поиска был установлен ранее)
- Filter ‘client1’ only – Фильтровать вывод только по значению ‘client1’
- Show all except ‘client1’ – Вывести все, исключая ‘client1’
Предположим, необходимо просмотреть только системные сообщения для хоста client1 – выбираем третий пункт Filter ‘client1’ only.
После этого в выводе появятся сообщения, относящиеся только к хосту client1.
Для возврата и сброса фильтров можно нажать на одну из иконок раскрывающегося списка (после столбца Messagetype) Back to unfiltered view with this message at top — возврат к выводу без фильтров с текущим сообщением в топе (в зависимости от того на какой строке было выбрано).