Translate

пʼятниця, 21 лютого 2014 р.

Налаштування централізованого логування із LogAnalyzer та Rsyslog

У цій статті я опишу установку та налаштування переглядача логів LogAnalyzer, Rsyslog-клієнта, який відсилатиме всі логи на віддалений Rsyslog-сервер, котрий в свою чергу буде писати їх в базу MySQL.

LogAnalyzer - веб-переглядач логів, що збирає системний демон rsyslog/syslog-ng, тобто виступає зручним фронендом.

У якості ОС я обрав Ubuntu 12.04. Адреси серверів:

192.168.1.51 (loganalyzer-mysql.ip) - rsyslog-сервер, на цьому ж хосту також буде проінстальовано LogAnalyzer

192.168.1.50 (loganalyzer-mongo.ip) - rsyslog-клієнт, що відсилатиме логи на хост  loganalyzer-mysql.ip

Налаштовуємо серверну частину, для чого додамо репозиторій від розробника Rsyslog:

# vim /etc/apt/sources.list
...
# Adiscon stable repository
deb http://ubuntu.adiscon.com/v7-stable precise/
deb-src http://ubuntu.adiscon.com/v7-stable precise/
...

# apt-key adv --recv-keys --keyserver keyserver.ubuntu.com AEF0CF8E
# gpg --export --armor AEF0CF8E | sudo apt-key add -

Звісно, що можна скористатись версією Rsyslog, що доступна в стандартних репозиторіях, проте в мене була наявна проблема із відкриттям 514 TCP-порту від користувача syslog.

Оновлюємо пакети та встановлюємо Rsyslog із певними додатковими пакетами, котрі надалі будуть необхідні:

# apt-get install rsyslog rsyslog-mysql mysql-server mysql-client

Як я вже сказав вище, будемо налаштовувати запис логів в локальну MySQL базу. Тому необхідно буде відповісти на певні питання в процесі встановлення. Пакет rsyslog-mysql під час конфігурації зробить запит на створення користувача та бази для зберігання майбутніх логів:


Попередньо слід указати пароль для користувача root бази данних. За його допомогою буде залита структура бази для rsyslog:


Указання паролю для окремого користувача rsyslog бази данних :


Якщо демону MySQL не існувало на хості - то установщик також запропонує створити пароль для користувача root.

Кінцевий конфіг інтеграції Rsyslog та MySQL виглядає наступним чином:

# vim /etc/rsyslog.d/mysql.conf 
### Configuration file for rsyslog-mysql
### Changes are preserved

$ModLoad ommysql
*.* :ommysql:localhost,Syslog,rsyslog,p@ssw0rD

*.* - запис всіх логів в базу
ommysql - модуль, за допомогою якого rsyslog писатиме в MySQL
Syslog - назва бази
rsyslog - користувач, якому надано доступ писати в базу Syslog
p@ssw0rD - пароль користувача rsyslog

Перевантажуємо rsyslog та перевіряємо базу:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Syslog             |
| mysql              |
| performance_schema |
| test               |
+--------------------+

mysql> use Syslog;

mysql> show tables;
+------------------------+
| Tables_in_Syslog       |
+------------------------+
| SystemEvents           |
| SystemEventsProperties |
+------------------------+

mysql> select * from SystemEvents limit 2 \G
*************************** 1. row ***************************
                ID: 1
        CustomerID: NULL
        ReceivedAt: 2014-02-11 04:22:52
DeviceReportedTime: 2014-02-11 04:22:52
          Facility: 5
          Priority: 6
          FromHost: loganalyzer
           Message:  [origin software="rsyslogd" swVersion="8.1.5" x-pid="11992" x-info="http://www.rsyslog.com"] start
...
        InfoUnitID: 1
         SysLogTag: rsyslogd:
      EventLogType: NULL
   GenericFileName: NULL
          SystemID: NULL
*************************** 2. row ***************************
                ID: 2
        CustomerID: NULL
        ReceivedAt: 2014-02-11 04:22:52
DeviceReportedTime: 2014-02-11 04:22:52
          Facility: 5
          Priority: 6
          FromHost: loganalyzer
           Message: rsyslogd's groupid changed to 103
...
        InfoUnitID: 1
         SysLogTag: rsyslogd:
      EventLogType: NULL
   GenericFileName: NULL
          SystemID: NULL
2 rows in set (0.00 sec)

mysql> 

Схоже, що логи пишуться, як і очікувалось.
Наразі налаштуємо прийом логів від будь-якого хосту. Для цього відредагуємо конфігураційний файл на сервері, тобто перевіримо чи не закоментовані рядки:

# vim /etc/rsyslog.conf
...
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
...

Розкоментовуємо їх і перевантажуємо службу rsyslog. Таким чином 514-ті порти UDP та TCP будуть відкриті для прийому логів.

Переходимо до налаштування Loganalyzer. Його буде встановлено на ноду із IP 192.168.1.51, тобто на ноду із Rsyslog-сервером. У якості веб-серверу використаємо Apache, тому встановимо його і пакети необхідні для роботи Loganalyzer-а:

# aptitude install apache2 libapache2-mod-php5 php5-mysql php5-gd

Завантажуємо останній Loganalyzer, розпаковуємо його, ставимо необхідні права на конфігураційні скрипти:

# mkdir /tmp/loganalyzer
# cd /tmp/loganalyzer
# wget http://download.adiscon.com/loganalyzer/loganalyzer-3.6.5.tar.gz
# tar zxvf loganalyzer-3.6.5.tar.gz
# mkdir /var/www/loganalyzer
# mv loganalyzer-3.6.5/src/* /var/www/loganalyzer
# mv loganalyzer-3.6.5/contrib/* /var/www/loganalyzer

# chmod +x /var/www/loganalyzer/configure.sh /var/www/loganalyzer/secure.sh
# ./configure.sh && ./secure.sh
# chown -R www-data:www-data /var/www/loganalyzer

На момент публікації цієї статті остання версія переглядача логів Loganalyzer - 3.6.5.
Сворємо віртуальний хост, в котрому слід не забути, як мінімум, змінити параметри ServerName та DocumentRoot:

# cd /etc/apache2/sites-available
# cp default loganalyzer.conf
# vim loganalyzer.conf

<VirtualHost *:80>
        ServerAdmin webmaster@localhost 
        ServerName loganalyzer-mysql.ip   #<<---insert your domainname here

        DocumentRoot /var/www/loganalyzer  #<<---insert root directory of unpacked Loganalyzer
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

Активуємо новостворений віртуальний хост, перевіряємо конфігураційні файли та перезавантажуємо Апач:

# a2ensite loganalyzer.conf
# a2dissite 000-default
# apachectl configtest
# service apache2 restart

Відкриваємо лінку http://loganalyzer-mysql.ip/install.php ( у моєму випадку loganalyzer-mysql.ip через /etc/hosts прив'язаний до IP-адреси 192.168.1.51). Відповідаємо на поставлені питання:


Перевірка прав доступу до директорій:


Конфігурація користувача для бази та деяких додаткових опцій. Вбиваємо сюди значення з конфігураційного файлу /etc/rsyslog.d/mysql.conf  про який я писав вище. Для цього може використовуватись лише база данних MySQL.


Перевірка доступів до бази по наданому логіну/паролю та залиття структури таблиць, якими буде користуватись LogAnalyzer.


Створення головного користувача до web-інтрерфейсу LogAnalyzer.


Додаємо джерело логів для показу. LogAnalyzer вміє показувати записи із текстового файлу, бази данних MongoDB чи MySQL. Описуємо опції доступу до бази (все пишемо в точності так як зображено на скріншоті нижче, регістр символів також важливий):




Все готово! Логінимось, використовуючи логін/пароль.


Інтерфейс LogAnalyzer-а виглядає наступним чином:


Користувачам браузера Chrome одразу пораджу прибрати галочку "Use Popup to display the full messagedetails", інакше будуть помітні значні графічні баги:


Наразі LogAnalyzer відображає логи лише з одного хосту, тобто саме ті, що збирає rsyslog. Тому налаштовуємо відсилання логів із віддаленого сервера, для чого редагуємо конфіг rsyslog на хосту 192.168.1.50 і додаємо опцію:

# vim /etc/rsyslog.conf
...
*.* @@192.168.1.51
...

*.* - опис всіх логів по важливості і програми, що їх пише.
@@ - відсилати логи по TCP
@ - відсилати логи по UDP
192.168.1.51 - сервер, куди будуть надіслані логи.

Іноді виникає бажання відсилати логи сервісів, що не вміють писати в syslog. Тому може бути в пригоді подібна конфігурація:

# vim /etc/rsyslog.d/mongo.conf
$ModLoad imfile
$InputFileName /var/log/mongodb/mongodb.log
$InputFileTag mongodb:
$InputFileStateFile stat-mongo-error
$InputFileSeverity error
$InputFileFacility daemon
$InputRunFileMonitor
error.* @@192.168.1.50


Все що в директорії /etc/rsyslog.d/ і з закінченням conf включається в основний конфіг /etc/rsyslog.conf. В даному випадку будуть відсилатись логи з текстового файлу /var/log/mongodb/mongodb.log і помічатись як помилки. Запис буде приблизно такий:

Feb 17 17:27:05 loganalyzer-mongo mongodb: Sun Feb 16 07:26:13 [clientcursormon] mem (MB) res:15 virt:624 mapped:0

І ось результуючий вигляд LogAnalyzer-а:


У якості бази зберігання логів можна використати інші варіанти. Ідеальним вибором може слугувати нереляційна база данних MongoDB, адже роботу з нею підтримує як LogAnalyzer, так і Rsyslog. Проте щодо підтримки MongoDB останнім у мене виникли певні труднощі: при компіляції всіх залежностей із сирців все прекрасно запрацювало, проте все завершується невдачею, якщо скористуватись бінарними пакетами із офіційних репозиторіїв.

Посилання:

Немає коментарів:

Дописати коментар