Syslog Server unter Debian Linux mit Rsyslog
Installation Rsyslog
Rsyslog ist ab Debian Lenny standarmäßig als Syslog Daemon installiert. Wenn man aber von einer früheren Debian Version (z.B.: Etch) kommt, muss man diesen nachinstallieren. Wie man an den Meldungen von aptitude sieht wird der andere Syslog Daemon deinstalliert.
aptitude install rsyslog
Konfiguration Rsyslog als Syslog Server
Zur Konfiguration des Rsyslog als Syslogserver lege ich eine Neue Konfigurationsdatei an, in der ich meine gewünschten Syslogserver Einstellungen vornehme:
/etc/rsyslog.d/syslogserver.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:
/etc/rsyslog.d/syslogserver.conf
# Logfile for each host $template DynaFile,"/var/log/syslog-%HOSTNAME%.log" *.* -?DynaFile
Hierbei werden für jeden Host ein Logfile unter /var/log/
erzeugt welches syslog-%HOSTNAME%.log
heißt aber trotzdem werden für Debugging Zwecke die Einträge auch nach /var/log/syslog
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.d/syslogserver.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/syslog-*.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
Unter Debian ist dies recht simpel, einfach folgenden Befehl ausführen und die Pakete installieren.
aptitude install rsyslog-mysql
Es wird hierbei ein eigener MySQL Server installiert und dort eine Datenbank Namens Syslog angelegt, in die nun der Rsyslog Dienst die Einträge schreibt. Man wird lediglich nach 2 Passwörtern gefragt, die man sich auf jedenfall merken sollte.
Zum testen des Konstruktes kann man sich zur Datenbank verbinden und nachschauen ob die Tabelle SystemEvents Einträge bekommt.
mysql -u root -p PASSWORT
Dann in der MySQL Konsole
use Syslog; select * from SystemEvents;
Rsyslog und ein nicht lokaler MySQL Server
Will man wie ich einen bereits vorhandenen MySQL Server im Netzwerk nutzen, wird es ein wenig komplizierter. Als erstes braucht man den mysql-client
:
aptitude install mysql-client
Nun sollte man prüfen ob der MySQL Benutzer "root" sich auch vom SyslogServer verbinden darf:
mysql -u root -p PASSWORT -h 192.168.1.1
mit "quit" kommt man nach einer erfolgreichen Anmeldung wieder aus der MySQL Shell.
So nun kann das rsyslog-mysql Paket ohne Abhängigkeiten installiert werden:
aptitude install rsyslog-mysql -R
Bei der Frage ob man via dbconfig-common Die Datenbank einrichten will sagt man "no". Wenn beim nächsten Schritt ein Fehler angemeckert wird diesen ignorieren (also "ignore" wählen).
Nun wird das Konstrukt mittels folgendem Befehl eingerichtet:
dpkg-reconfigure rsyslog-mysql
Nun einfach den Anweisungen folgen und dann noch den Rsyslog Dienst neustarten:
/etc/init.d/rsyslog restart
Dieser Assistent sollte nun auf dem angegebenen MySQL Server eine neue Datenbank anlegen und alle Syslog Einträge dorthin schicken.
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="user" password="password" # 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 ln -s /usr/local/sbin/delete_mysql /etc/cron.daily/delete_mysql
PHPLogcon/Loganalyzer einrichten
Achtung: PHPLogcon ist nun Loganalyzer
PHPLogcon heißt nun Loganalyzer, ist aber von der Installation genau gleich und unter folgender URL zu bekommen. Loganalyzer heißt das Program seit Version 3.0
Hier die Anleitung zur Loganalyzer Installation
Installation Loganalyzer
Hersteller Homepage: http://loganalyzer.adiscon.com
Zuerst 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
Installation PHPLogcon
!!!Bitte nutzt den Loganalyzer!!!!
Hersteller Homepage: http://www.phplogcon.org
Zuerst wird das Paket heruntergeladen und entpackt:
cd /usr/src wget http://www.phplogcon.org/Downloads-req-getit-lid-63.phtml tar -xzvf phplogcon-2.8.1.tar.gz
Nun den PHPLogcon Folder in den vhost verschieben:
mv phplogcon-2.8.1/src /var/www/phplogcon mv phplogcon-2.8.1/contrib/*.sh /var/www/phplogcon cd /var/www/phplogcon chmod u+x configure.sh chmod u+x secure.sh ./configure.sh
Dann im Browser die URL aufrufen:
http://hostname/phplogcon/install.php
und den Konfiguartions Schritten folgen. Die Standard Konfig nimmt /var/log/syslog als Logfile.
Nun ist PHPLogcon unter folgender URL erreichbar:
http://hostname/phplogcon/
Nun zum Schluss noch:
cd /srv/httpd/vhosts/domain.de/htdocs/loganalyzer/
./secure.sh
rm configure.sh secure.sh
PHPLogcon/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
PHPLogcon/Loganalyzer und MySQL Process ID Patch
Bei der Standard Installation wie sie oben Beschrieben ist gibt es ein Problem, die Prozess IDs landen nicht im der vorgegebene Tabellenspalte, dies kann durch dieses HowTo gefixt werden.
Als erstes muss das rsyslog und rsyslog-mysql Packet von den Lenny Backports installiert werden:
HowTo Backports installieren: Debian Linux - Backports hinzufügen
aptitude -t lenny-backports install rsyslog rsyslog-mysql
Als nächstes muss die Datenbak aktualisiert werden:
mysql -u root -p
Dann in der Mysql Shell:
use Syslog; ALTER TABLE SystemEvents ADD COLUMN `ProcessID` char(8) default NULL; quit
Nun muss das PHPLogcon noch angepasst werden, und zwar muss in der Datei include/constants_logstream.php unter folgende Zeile:
$dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_EVENT_USER] = "EventUser";
folgende Zeile einkommentiert oder hinzugefügt werden:
$dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_PROCESSID] = "ProcessID";
Nun noch den Rsyslog anpassen:
/etc/rsyslog.d/mysql.conf
### Configuration file for rsyslog-mysql ### Changes are preserved $ModLoad ommysql $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 *.* :ommysql:192.168.160.10,Syslog,rsyslog,rsyslog2009;OurDBLog
und den Rsyslog Dienst neustarten:
/etc/init.d/rsyslog restart
So, nun sollten die Process IDs schön in ihrer Spalte landen.
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: