SysLog-Server auf MySQL-Basis

Als erstes sollte man MySQL installieren:

aptitude install mysql-server

Nach erfolgreicher Installation muss jetzt noch eine Logtabelle angelegt werden.

In diesem Fall wollen wir jeden Monat eine neue Tabelle verwenden. Das bedeutet aber auch, dass man am besten auch immer die Tabelle für den nächsten Monat mit anlegt!

Das Script mit dem die Tabellen generiert werden, kann per Cron gestartet werden. Im folgenden ist der Code zu sehen:

#!/bin/sh
#
MYSQLUSER=root
MYSQLPWD=oqtest
MYSQLDB="syslog"
#
MYSQLTAB1="logs_$(date +'%Y%m')"
MYSQLTAB2="logs_$(date -d+1month +'%Y%m')"
#
### logs-Tabellen anlegen
echo "
CREATE DATABASE IF NOT EXISTS ${MYSQLDB};
USE ${MYSQLDB};
CREATE TABLE IF NOT EXISTS ${MYSQLTAB1} (
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,
date date default NULL,
time time default NULL,
program varchar(15) default NULL,
msg text,
seq int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (seq),
KEY host (host),
KEY seq (seq),
KEY program (program),
KEY time (time),
KEY date (date),
KEY priority (priority),
KEY facility (facility)
) TYPE=MyISAM;
CREATE TABLE IF NOT EXISTS ${MYSQLTAB2} (
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,
date date default NULL,
time time default NULL,
program varchar(15) default NULL,
msg text,
seq int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (seq),
KEY host (host),
KEY seq (seq),
KEY program (program),
KEY time (time),
KEY date (date),
KEY priority (priority),
KEY facility (facility)
) TYPE=MyISAM;
" | mysql -h localhost -u${MYSQLUSER} -p${MYSQLPWD}
#
### neuen User mit verschlüsseltem Passwort anlegen
echo "
GRANT ALL ON ${MYSQLDB}.${MYSQLTAB1} TO 'syslog'@'localhost' IDENTIFIED BY 'mysyslog';
GRANT ALL ON ${MYSQLDB}.${MYSQLTAB2} TO 'syslog'@'localhost' IDENTIFIED BY 'mysyslog';
" | mysql -h localhost -u${MYSQLUSER} -p${MYSQLPWD}

Damit ist es aber nicht getan, denn jetzt muss man auch noch dafür sorgen, das der SysLog die Daten in die DB reinpumpen kann.

Das wird mit einem Script realisiert, das die Daten über eine fifo-Datei vom SysLog-Daemon entgegen nimmt und dann in die DB pumpt. Die Daten werden (wie man in der syslog-ng.conf sehen kann) vom SysLog-Daemon schon zu SQL-Querys aufbereitet, sodass dieses Script nichts an den Daten verändern muss.

#!/bin/bash
#
MYSQLUSER="syslog"
MYSQLPWD="mysyslog"
MYSQLDB="syslog"
#
if [ ! -e /tmp/mysql.pipe ]; then
      mkfifo /tmp/mysql.pipe
fi
#
while [ -e /tmp/mysql.pipe ]
do
        mysql -h localhost -u${MYSQLUSER} -p${MYSQLPWD} ${MYSQLDB} < /tmp/mysql.pipe
done

Dieses Script muss beim Systemstart automatisch gestartet werden!

Man kann das auf unterschiedliche Weise tun, entweder durch eintragen in die "/etc/rc.local" aber leider wird diese Datei in vielen Distributionen beim Systemstart nicht mehr ausgeführt. Dann gibt es noch die Möglichkeit, dass man sich ein Start-Stop-Script schreibt welches dafür sorgt, dass diese Datei beim hoch fahren gestartet wird.

Der Aufruf dafür könnte so aussehen:

nohup /root/bin/log2mysql.sh &