Лабораторная работа посвящена вопросам хранения журналов системы в реляционной базе данных. В ней демон журнализации настраивается на хранение информации в базе данных СУБД MySQL, а затем к ней осуществляется доступ через Web-интерфейс.
Настройте Syslog-NG так, чтобы он заносил журнальную информацию не в файлы, а в базу данных под управлением MySQL.
Инсталляция MySQL.
Проверьте, установлена ли в системе СУБД MySQL, и если нет, проинсталлируйте её.
Изменение конфигурации Syslog-NG.
Отредактируйте конфигурационный файл syslog-ng.conf
.
Добавьте в него следующие строки:
destination d_mysql { pipe("/var/log/mysql.pipe" template("INSERT INTO logs ( host, facility, priority, level, tag, datetime, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n") template-escape(yes)); }; log { source(src); destination(d_mysql); };
Сделанные изменения заставят Syslog-NG направлять все поступающие из источника
src
сообщения в канал /var/log/mysql.pipe
. Сообщения будут записываться в
канал в виде строк с заданной структурой, структурой команд MySQL,
что позволит впоследствии просто подать канал на вход MySQL-клиенту.
Клиент начнёт читать строки из канала, интерпретировать их, и, в результате
интерпретации, добавлять данные в базу данных.
Старые получатели сообщений не исчезнут – в канал будут попадать копии сообщений.
Создание канала для записи данных Syslog-NG.
# mkfifo /var/log/mysql.pipe
Перезапуск демона Syslog-NG.
Перезагрузите демон Syslog-NG принятым в операционной системе способом:
# /etc/init.d/syslog-ng restart
# /usr/local/etc/rc.d/syslog-ng stop # /usr/local/etc/rc.d/syslog-ng start
Создание таблицы syslog для MySQL.
Подключитесь к MySQL
# mysql -u root -p
Password:
Если пароль для подключение к СУБД отсутствует,
в ответ на приглашение Password:
нужно просто нажать <key>enter</key>.
В этом случае ключ -p
можно было и не использовать:
# mysql -u root
и создайте базу данных и таблицу в ней для хранения данных системного журнала:
# создаём базу данных syslog CREATE DATABASE syslog; USE syslog; # в базе данных syslog создаём таблицу logs # для хранения журнальной информации CREATE TABLE logs ( host varchar(32) default NULL, facility varchar(10) default NULL, priority varchar(10) default NULL, level varchar(10) default NULL, tag varchar(10) default NULL, datetime datetime default NULL, program varchar(15) default NULL, msg text, seq bigint(20) unsigned NOT NULL auto_increment, PRIMARY KEY (seq), KEY host (host), KEY program (program), KEY datetime (datetime), KEY priority (priority), KEY facility (facility) ) TYPE=MyISAM; USE mysql; # создаём пользователей syslog и syslogadmin INSERT INTO user (Host, User, Password) VALUES ('localhost','syslog', password('ПАРОЛЬ
')); INSERT INTO db (Host, Db, User) VALUES ('localhost','syslog','syslog'); INSERT INTO user (Host, User, Password) VALUES ('localhost','syslogadmin',password('ПАРОЛЬ
')); INSERT INTO db (Host, Db, User) VALUES ('localhost','syslog','syslogadmin'); COMMIT; # Записать кэш привилегий во избежание ошибок FLUSH PRIVILEGES; # пользователь syslogadmin получил права, необходимые для резервного копирования REVOKE ALL PRIVILEGES ON syslog.* FROM syslogadmin@localhost; REVOKE GRANT OPTION ON syslog.* FROM syslogadmin@localhost; GRANT RELOAD ON *.* TO syslogadmin@localhost; GRANT SELECT, INSERT, DELETE, CREATE, ALTER, LOCK TABLES ON syslog.* TO syslogadmin@localhost; REVOKE ALL PRIVILEGES ON syslog.* FROM syslog@localhost; REVOKE GRANT OPTION ON syslog.* FROM syslog@localhost; GRANT USAGE ON *.* TO syslog@localhost; GRANT SELECT ON syslog.* TO syslog@localhost;
Создание скрипта резервного копирования.
Создайте каталог, в котором будет находиться резервная копия базы данных:
# mkdir /var/log/backup # chmod 600 /var/log/backup
Создайте скрипт backup_syslog.sh
, который будет
выполнять резервное копирование базы данных syslog СУБД MySQL:
# vi /usr/local/sbin/backup_syslog.sh
#!/bin/sh
# каталог /var/log/backup должен быть создан с правами доступа 600
/usr/bin/mysqlhotcopy --user=syslogadmin --password=ПАРОЛЬ
--allowold syslog /var/log/backup
Копирование будет выполняться в каталог /var/log/backup
.
Убедитесь, что это каталог существует, и что права доступа
к этом каталогу равны 600.
Для работы скрипта требуется mysql-scripts
,
в состав которого входит mysqlhotcopy
Создание скрипта переноса данных из журнала в MySQL.
Данные не будут попадать в MySQL автоматически.
Syslog-NG записывает данные в созданный канал mysql.pipe
,
но нужно чтобы кто-то считывал эти данные оттуда, и переносил
их базу данных.
Создайте скрипт syslog_mysql.sh
, который будет переносить
данные из канала в базу данных:
# vi /usr/local/sbin/syslog_mysql.sh
#!/bin/sh if [ -e /var/log/mysql.pipe ]; then while [ -e /var/log/mysql.pipe ] do /usr/bin/mysql -u syslogadmin --password=ПАРОЛЬ
syslog < /var/log/mysql.pipe /usr/local/bin/mysql -u syslogadmin --password=ПАРОЛЬ
syslog < /var/log/mysql.pipe done else mkfifo /var/log/mysql.pipe fi
Скрипт должен быть исполняемым:
# chmod +x /usr/local/sbin/syslog_mysql.sh
Запуск скрипта.
Запустите скрипт на исполнение.
# /usr/local/sbin/syslog_mysql.sh
Добавление скрипта в загрузку.
Добавьте запуск скрипта /usr/local/sbin/syslog_mysql.sh
в загрузку.
# vi /etc/rc.local
nohup /usr/local/sbin/syslog_mysql.sh &
Создание скрипта ротации журнала.
Используйте скрипт Паснака (Pasnak), выполняющего ротацию журналов в базе MySQL, написанный на PHP или аналогичный скрипт, написанный на Shell (см. ниже):
# vi /etc/cron.monthly/syslog_rotate.php
# vi /etc/periodic/monthly/syslog_rotate.php
#!/usr/bin/php <?php # syslog_rotate.php # J.P. Pasnak # 29/09/2004 # # This script rotates the mysql syslog-ng database # on a monthly basis. Place in "/etc/cron.monthly". # To change to weekly/daily, adjust "$date" and place # in the appropriate cron folder. $link = mysql_connect("localhost", "syslogadmin", "$pwadmin"); if (!$link) { die("Could not connect: " . mysql_error()); } echo "Connected successfully\n"; // make syslog the current db $db_selected = mysql_select_db("syslog", $link); if (!$db_selected) { die ("Can\"t use syslog : " . mysql_error()); } // Rename the table, appending short month $last= mktime(0, 0, 0, date("m")-1, date("d"), date("Y")); $date = date("M", $last); $result = mysql_query("ALTER TABLE `logs` RENAME `logs-$date`"); if (!$result) { die("Invalid query: " . mysql_error()); } // Recreate the original table $result="CREATE TABLE logs (host varchar(32) default NULL, facility varchar(10) default NULL, priority varchar(10) default NULL, level varchar(10) default NULL, tag varchar(10) default NULL, datetime datetime default NULL, program varchar(15) default NULL, msg text, seq int(10) unsigned NOT NULL auto_increment, PRIMARY KEY (seq), KEY host (host), KEY program (program), KEY datetime (datetime), KEY priority (priority), KEY facility (facility)) TYPE=MyISAM;"; if (mysql_query($result)){ echo "success in table creation.\n"; } else { echo "no table created.\n"; } mysql_close($link); ?>
Павел Кудин переписал этот скрипт для интерпретатора shell. В том случае, если в системе не используется php, лучше использовать этот скрипт:
# vi /etc/cron.monthly/syslog_rotate.sh
# vi /etc/periodic/monthly/syslog_rotate.sh
#!/bin/sh # P. Kudin (based on J.P. Pasnak php script) # 18/10/2005 dbuser=syslogadmin dbpwd=syslogadmin last=`date --date='-1 month' +%b`; echo "ALTER TABLE logs RENAME logs_$last;" | mysql -u $dbuser --password=$dbpwd syslog || exit 1 cat << SQL | mysql -u $dbuser --password=$dbpwd syslog || exit 1 CREATE TABLE logs (host varchar(32) default NULL, facility varchar(10) default NULL, priority varchar(10) default NULL, level varchar(10) default NULL, tag varchar(10) default NULL, datetime datetime default NULL, program varchar(15) default NULL, msg text, seq int(10) unsigned NOT NULL auto_increment, PRIMARY KEY (seq), KEY host (host), KEY program (program), KEY datetime (datetime), KEY priority (priority), KEY facility (facility)) TYPE=MyISAM; SQL
Файл должен быть доступен для чтения/изменения/исполнения только суперпользователю:
# chmod 700 /etc/cron.monthly/syslog_rotate.php # chown root:root /etc/cron.monthly/syslog_rotate.php
# chmod 700 /etc/periodic/monthly/syslog_rotate.php # chown root:wheel /etc/periodic/monthly/syslog_rotate.php
или, если используется shell-скрипт:
# chmod 700 /etc/cron.monthly/syslog_rotate.sh # chown root:root /etc/cron.monthly/syslog_rotate.sh
# chmod 700 /etc/periodic/monthly/syslog_rotate.sh # chown root:wheel /etc/periodic/monthly/syslog_rotate.sh
Настройка периодического выполнения скриптов.
Отредактируйте общесистемный файл-расписание crontab и добавьте в него следующие строки:
0 0 * * * root /usr/local/sbin/backup_mysql.sh >> /var/log/mysql.log 2>&1
Резервное копирование базы данных будет выполняться ежедневно в 0:00.
Ошибки выполнения команд (если таковые будут),
будут записываться в файл /var/log/mysql.log
.
Проинсталлировать и настроить PHP-Syslog-ng для доступа к журналам системы через Web-интерфейс
Получение архива PhpSyslogNG.
Загрузите архив PHPSyslogNG отсюда PHPSyslogNG
Инсталляция.
Распакуйте полученный архив
и разместите в дерева каталогов web-сервера Apache
или где-либо в файловой системе
Далее будем считать, что архив находится в каталоге
/usr/local/share/phpsyslogng
Замечание | |
---|---|
В том случае, если приложение находится за пределами дерева каталогов Web-сервера, в конфигурационном файле Apache должен быть создан алиас, указывающий на положение программы в файловой системе. |
# tar xvfz архив.tar.gz # mv phpsyslog* /usr/local/share/phpsyslogng
Для работы PHPSyslogNG необходимы Web-сервер,
php4
и php4-extensions
.
Конфигурирование.
Укажите в конфигурационном файле PHPSyslogNG, адрес для подключения к базе данных MySQL и параметры подключения.
# vi /usr/local/share/phpsyslogng/config/config.php
42c42
< define('DBUSER', 'user');
< define('DBUSER', 'user');
---
> define('DBUSER', 'syslogadmin');
> define('DBUSERPW', 'ПАРОЛЬ
');
70c70
< define('REQUIRE_AUTH', TRUE);
---
> define('REQUIRE_AUTH', FALSE);
Проверка.
Обратитесь на страничку PHPSyslogNG вашего web-сервера для того чтобы убедиться, что он работает верно.
© 2002-2005 Игорь Чубин |
Учебный центр Сетевые Технологии, ug-ids, 2006-06-25 |
Слушатель отсутствует, ДЕМО-ВЕРСИЯ |