Syslog Server unter Red Hat Linux mit Rsyslog
Installation Rsyslog
Rsyslog ist ab Red Hat Enterprise Linux 6 standarmäßig als Syslog Daemon installiert. Wenn man aber von einer früheren Version kommt, muss man diesen nachinstallieren.
yum install rsyslog
yum remove sysklogd
Konfiguration Rsyslog als Syslog Server
In der Datei /etc/rsyslog.conf muss zur Aktivierung des Syslog Servers einfach folgende Zeilen einkommentiert werden:
/etc/rsyslog.conf
# provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 # provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514
Eigenes Logfile für jeden Syslog Client
Will man nun auf dem Syslog Server ein eigenes Syslog Logfile für jeden einzelnen Host erstellen funktioniert dies so:
# Logfile for each host $template DynaFile,"/var/log/messages-%HOSTNAME%.log" *.* -?DynaFile
Hierbei werden für jeden Host ein Logfile unter /var/log/ erzeugt welches messages-%HOSTNAME%.log heißt aber trotzdem werden für Debugging Zwecke die Einträge auch nach /var/log/messages geschrieben.
Eigenes Logfile für einzelne Dienste
Um ein eigenes Logfile zum Beispiel für den Dienst "noflushd" zu erstellen muss man folgendes der Datei
/etc/rsyslog.conf anhängen:
# Logfile for noflushd if $programname == 'noflushd' then /var/log/noflushd
Dienst Logeinträge nicht an Syslogserver schicken
Wenn man zum Beispiel die FTP Logeinträge nicht an den Syslogserver schicken mag kann das mit folgender Zeile getan werden:
*.*,ftp.none @192.168.1.1
Lokales Logging deaktivieren
Will man die Logeinträge nur an den Syslog Server schicken, reicht es direkt unterhalb des Syslogeintrages, der als erstes beim den "Rules" stehen sollte, folgende Zeile zu ergänzen:
*.* ~
Ab dieser Zeile werden alle Logeinträge einfach weggeschmissen.
Die neuen Logfiles rotieren
Die neu angelegten Logfiles sollten nun natürlich auch noch von Logrotate rotiert werden, damit das System nicht volläuft.
Hierzu kann die Datei folgende Datei erstellt werden:
/etc/logrotate.d/rsyslog-newlogs
/var/log/messages-*.log { rotate 7 daily missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog reload > /dev/null endscript } /var/log/noflushd { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate invoke-rc.d rsyslog reload > /dev/null endscript }
Konfiguration Rsyslog als Syslog Client
um alle Logeinträge zum Syslog Server zu schicken muss folgende Zeile in die Konfigurationsdatei eingetragen werden:
/etc/rsyslog.conf
Bei der neusten Ubuntu in folgender Datei:
/etc/rsyslog.d/50-default.conf
für UDP
*.* @192.168.1.1
für TCP
*.* @@192.168.1.1
Wo man diese Zeile einfügt ist eigentlich egal, aber das beste ist denke ich wenn man sie vor den lokalen Logdateien einhängt:
....... # # First some standard log files. Log by facility. # #Send all to Syslog Server *.* @192.168.1.1 auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log .......
Will man das Lokal keine Syslog Logfiles geschrieben werden, sollte man sämtliche Logfile einträge kommentieren:
z.B.: Kein /var/log/syslog:
#*.*;auth,authpriv.none -/var/log/syslog
Konfiguration Windows Client "Eventlog-To-Syslog"
Man kann auch Windows Systeme in den Syslog Server schreiben lassen, wie das geht wird hier beschrieben:
Windows Eventlog und Syslog Server
Testing
Um das Konstrukt zu testen schaut man sich am besten einfach das syslog Logfile auf dem Syslogserver an:
tail -f /var/log/syslog
und lässt auf einem der Syslog Clients folgenden Befehl los:
logger "Es funktioniert"
Im Syslog sollte dann dies auftauchen:
May 15 10:47:11 hostname root: Es funktioniert
Rsyslog mit MYSQL Anbindung und PHPLogcon
Rsyslog und Mysql
Hierfür wird als erstes das MySQL-Rsyslog Modul und natürlich der MySQL Server selbst benötigt:
yum install rsyslog-mysql mysql mysql-server
chkconfig mysqld on
Nun legen wir die Datenbank Dateien noch nach /srv/mysql um:
mv /var/lib/mysql /srv/
/etc/my.cnf
[mysqld] datadir=/srv/mysql
/etc/init.d/mysqld start
Als nächstes richten wir die Datenbankbenutzer und die Datenbank selbst ein:
/usr/bin/mysqladmin -u root password 'newpassword'
mysql -u root -p
Der nächste Schritt ist das Erstellen der Datenbank. Dazu liefert Rsyslog ein eigenes Skript mit:
mysql -u root -p < /usr/share/doc/rsyslog-mysql-5.8.10/createDB.sql
und nun im MySQL:
grant all on *.* to 'root'@'%' identified by 'newpassword';
CREATE USER 'syslog'@'localhost' IDENTIFIED BY 'syslogpassword';
GRANT ALL PRIVILEGES ON `Syslog` . * TO 'syslog'@'localhost';
use Syslog;
ALTER TABLE SystemEvents ADD COLUMN `ProcessID` char(8) default NULL;
Nachdem nun der MySQL Server konfiguriert ist, müssen wir dem Rsyslog noch sagen, das er in die DB schreiben soll:
/etc/rsyslog.conf
#### MySQL #### $template OurDBLog,"INSERT INTO SystemEvents (Message, Facility, FromHost, Priority, \ DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag, ProcessID) values \ ( '%msg%',%syslogfacility%,'%HOSTNAME%',%syslogpriority%,'%timereported:::date-mysql%',\ '%timegenerated:::date-mysql%',%iut%,'%programname%','%procid:R,ERE,0,ZERO:[0-9]+--end%')",SQL $ModLoad ommysql *.*,Local6.none :ommysql:localhost,Syslog,syslog,syslogpassword;OurDBLog
dannach am besten beide Dienste neustarten:
/etc/init.d/mysqld restart
/etc/init.d/rsyslog restart
Rsyslog und MySQL - Datenbank aufräumen
Wenn man mehrere Systeme in die Datenbank schreiben lässt, kommt nach und nach eine ganze Menge Daten zusammen und die Datenbank wächst und wächst. Hierfür gibt es aber eine tolle Lösung direkt von den Rsyslog Programmierern. Es handelt sich um ein kleines Skript Namens delete_mysql.sh, welches standardmäßig alle Einträge älter als 30 Tage löscht und danach die Datenbank aufräumt.
delete_mysql.sh
#!/bin/bash # Database maintance script which can be used for rsyslog # and phplogcon default database schema. # Michael Mansour suggested it to be included - thx! # This program was original part of of PHPloghost # Copyright (C) 2004 Tuatha de Dana # some modifications for rsyslog by mmeckelein at 2007-08-08 # 2007-08-13 mmeckelein: added dbhost and some other improvements # suggested by Michael Mansour - thx a lot! # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111- 1307, USA. # Change these variables to reflect your situation. database=Syslog dbhost="localhost" export table=SystemEvents sqluser="syslog" password="syslogpassword" # Location of the mysql daemon: mysqld=/usr/bin/mysql # A couple of steps should be taken to maintain your database. # If not, the number of messages will fill your database. # By default, logs are deleted after they're 30 days old. # Change this to meet your requirements. # rsyslog's default database template use two date columns # ReceivedAt and DeviceReportedTime. You can use either of # the two and in most cases it doesn't make a huge difference. # See the property replacer doc at http://www.rsyslog.com/doc # for details on the two dates. SQL_DELETE="DELETE FROM $table WHERE ReceivedAt < CURDATE() - INTERVAL 30 DAY;" # After a large amount of rows have been deleted, we should # optimize the table. SQL_OPT="OPTIMIZE TABLE $table;"; $mysqld -u$sqluser -p$password -h$dbhost -e"$SQL_DELETE" -D$database $mysqld -u$sqluser -p$password -h$dbhost -e"$SQL_OPT" -D$database
Download des Skriptes: Delete_mysql.zip
Diese Skript sollte am besten nach /usr/local/sbin/delete_mysql gelegt werden und täglich via cron gestartet werden:
chmod +x /usr/local/sbin/delete_mysql.sh ln -s /usr/local/sbin/delete_mysql.sh /etc/cron.daily/delete_mysql
Loganalyzer einrichten
Installation Loganalyzer
Hersteller Homepage: http://loganalyzer.adiscon.com
Voraussetzung hierfür ist ein funktionierender Apache HTTPd inklusive PHP und dem PHP-MySQL Modul.
yum install httpd php php-mysql
Ist diese Voraussetzung erfüllt, wird das Paket heruntergeladen und entpackt:
cd /usr/src
wget http://download.adiscon.com/loganalyzer/loganalyzer-3.4.1.tar.gz
tar -xzvf loganalyzer-3.4.1.tar.gz
Nun den Webcontent Folder des Source Paketes in den vhost kopieren:
mv /usr/src/loganalyzer-3.4.1/src /srv/httpd/vhosts/domain.de/htdocs/loganalyzer
mv /usr/src/loganalyzer-3.4.1/contrib/*.sh /srv/httpd/vhosts/domain.de/htdocs/loganalyzer/
cd /srv/httpd/vhosts/domain.de/htdocs/loganalyzer/
chmod u+x configure.sh
chmod u+x secure.sh
./configure.sh
Nun im Browser die URL Aufrufen: http://hostname/loganalyzer/install.php
und den Konfigurationsschritten folgen. Die Standard Konfiguration nimmt /var/log/syslog als Logfile.
Nun ist der Loganalyzer unter folgender URL erreichbar:
http://hostname/loganalyzer/
cd /srv/httpd/vhosts/domain.de/htdocs/loganalyzer/
./secure.sh
rm configure.sh secure.sh
Loganalyzer und MySQL
Ist im Prinzip die gleiche Installation der einzige Unterschied ist, dass man sich an die SYSLOG MySQL Datenbank verbindet. Man benötigt hierfür:
- MySQL Server IP (192.168.1.1)
- einen User der auf die Datenbank connecten darf (rsyslog@localhost)
- Datenbank Name (Syslog)
- Tabellen Name (SystemEvents)
Also auch hier
http://hostname/loganalyzer/install.php
aufrufen und den Anweisungen folgen, dann anstelle vom lokalen Syslogfile einfach MySQL Datenbank wählen und die Credentials eintragen. Zum Beispiel:
Name of the Source: My Syslog Source Source Type: MySQL Native Select View: SyslogView Database Type Options Table type: MonitorWare Database Host: localhost Database Name: Syslog Database Tablename: SystemEvents Database User: rsyslog Database Password: yourpassword Enable Row Counting: No
Nun ist der Loganaylzer unter folgender URL erreichbar:
http://hostname/loganalyzer/
Nun zum Schluss noch:
cd /srv/httpd/vhosts/domain.de/htdocs/loganalyzer/
./secure.sh
rm secure.sh configure.sh
Tuning PHPLogcon MySQL Datenbank
Leider wird bei einer immer größer werdenden Datenbank das Analyse Frontend immer langsamer. Folgende Tuning Maßnahmen können deshalb angewandt werden:
Zusätzliche Indizies in die Syslog Datenbank einbauen:
mysql -u root -p
und nun folgende Befehle in der MySQL Shell eintippen:
use Syslog;
ALTER TABLE SystemEvents ADD KEY `FromHost` (`FromHost`); ALTER TABLE SystemEvents ADD KEY `SysLogTag` (`SysLogTag`); ALTER TABLE SystemEvents ADD KEY `Facility` (`Facility`); ALTER TABLE SystemEvents ADD KEY `ReceivedAt` (`ReceivedAt`); ALTER TABLE SystemEvents ADD KEY `DeviceReportedTime` (`DeviceReportedTime`); ALTER TABLE SystemEvents ADD FULLTEXT KEY `Message` (`Message`);
CREATE INDEX index_DeviceReportedTime ON SystemEvents(DeviceReportedTime); CREATE INDEX index_FromHost ON SystemEvents(FromHost); CREATE INDEX index_ReceivedAt ON SystemEvents(ReceivedAt); CREATE INDEX index_SysLogTag ON SystemEvents(SysLogTag); CREATE INDEX index_Facility ON SystemEvents(Facility); CREATE INDEX index_Priority ON SystemEvents(Priority);
Nach diesen Maßnahmen war es bei mir gefühlt schneller.
Weiteres über MySQL Tuning hier: