Inhaltsverzeichnis

Syslog

Linux PCs haben standardmäßig einen Syslog-Daemon welcher informationen über das System, den Kernel, und andere Software sammelt und in
Textdateien abspeichert.

Ubuntu hat standardmäßig den rsyslogd installiert.

Remotelogging

Um dem rsyslogd zu sagen dass er auch auf der Netzwerkkarte nach Syslog-Meldungen horchen soll muß folgendes konfiguriert werden.

vi /etc/rsyslog.conf

Hier bei folgenden Zeilen die Rauten (#), am Anfang, löschen.

$ModLoad imudp
$UDPServerRun 514

$ModLoad imtcp
$InputTCPServerRun 514

Danach den Daemon neustarten.

service rsyslog restart

Logdateien separieren

Auf verschiedene Weise können die einzelnen Syslog-Meldungen in verschiedene einzelne Textdateien geschrieben werden.
Hier sind einige Möglichkeiten aufgezählt.

Es macht Sinn eigene Regelwerke in einer eigenen Konfigurationsdatei abzulegen, welche vor den Standardmäßigen Regelwerken abgearbeitet wird.
Hierfür erstellt man eine Datei unter /etc/rsyslog.d, nach vorgegebenem Format <NUMMER-NAME>.conf.
Nimmt man hier eine kleinere Zahl im Dateinamen, als die der Standarddatei (/etc/rsyslog.d/50-default.conf), wird diese Datei mit ihren Regeln vorher abgearbeitet.

Wichtig bei diesen Befehlszeilen sind immer die Zeichen & ~, diese sagen aus, dass nach dem Abarbeiten der zutreffenden Regel, keine weitere Prüfung auf andere Regeln stattfindet. Wenn die Zeichen nicht angegeben werden, dann greift die spätere Standardregel von rsyslog welche die Meldungen in die Datei /var/log/syslog schreibt.
Man hat somit eine doppelte Datenhaltung.

In der 50-default.conf kann man auch Meldungen in die syslog-Datei ausschließen, in dem die Severity „none“ nach dem Facility-Feld gewählt wird.
Hier ein Beispiel anhand der Meldungen des Facility „mail“:

*.*;mail.none                -/var/log/syslog

Hiermit werden die Meldungen vom Postfix, Dovecot, … nicht mehr in die Syslog-Datei geschrieben.

Beispiel:
Hier wird eine ankommende Meldung auf den Hostnamen oder IP-Adresse geprüft. Wenn eines zutrifft wird die Meldung in die angegebene Textdatei gespeichert.

if $fromhost == '<HOSTNAME_ODER_IP>' then <PFAD_ZU_LOG_DATEI>
& stop

Hier wird eine ankommende Meldung zusätzlich auf den Nachrichteninhalt geprüft. Wenn hier noch einer der gesuchten Begriffe zutrifft, dann wird separiert.

if $fromhost == '<HOSTNAME_ODER_IP>' and ($msg contains '<BEGRIFF>' or $msg contains '<BEGRIFF>' or $msg contains '<BEGRIFF>') then <PFAD_ZU_LOG_DATEI>
& stop

Templates

Templates kann man für verschiedene Zwecke nutzen eine ausführliche Beschreibung findet man bei rsyslog.com.
Folgend findet man Beispiele, wie man Templates einsetzen kann.

MessageFormat

Format einer Syslog Nachricht ersetzt um ein rfc3339 konformes Datum.

template(name="FileFormat" type="list") {
    property(name="timestamp" dateFormat="rfc3339")
    constant(value=" ")
    property(name="hostname")
    constant(value=" ")
    property(name="syslogtag")
    property(name="msg" spifno1stsp="on" )
    property(name="msg" droplastlf="on" )
    constant(value="\n")
    }

Man könnte das Template auch wie folgt schreiben (Wichtig: Dabei muss die Definition des Templates in einer einzelnen Zeile geschrieben werden):

template(name="FileFormat" type="string" string= "%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n")

Hier noch ein Beispiel, welches ich verwendet habe um einen Syslogtimestamp durch ein rfc3339 (bei den Logstash-Patterns ist das ein TIMESTAMP_ISO8601) Datum zu ersetzen.

template(name="Daterfc" type="string" string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag% %msg%\n")
*.* /var/log/syslog;Daterfc

DynamicFileNameFormat

template(name="FileNameDateToday" type="string" string="/var/log/syslog_%$year%-%$MONTH%_%$DAY%.log")
*.* ?FileNameDateToday

Nachrichten senden

Mit dem Tool logger lassen sich Syslog-Nachrichten versenden.

logger -n <IP_OR_HOST> -P <PORT> [--tcp|--udp] -p <FACILITY>.<PRIORITY> -t <SYSLOG_TAG> "<NACHRICHTENTEXT>"

oder mit Netcat (-n: keine neue Zeile; -4: IPv4; -u: UDP; -w: wait)

echo -n "Test" | nc -4 -u -w 1 <IP_OR_HOST> <PORT>

Log-Analyse

Man kann die Textdateien manuell mit cat, grep oder tail untersuchen.

Eine andere schöne Webbasierte Lösung ist LogAnalyzer.
Installiert wird dieser wie folgt:

wget http://download.adiscon.com/loganalyzer/loganalyzer-3.4.3.tar.gz
tar xfz loganalyzer-3.4.3.tar.gz
cd /var/www
mkdir logs
cd logs
cp -a <PFAD_ZU_ENTPACKTEM_VERZEICHNIS>/src* .
chown -R www-data.www-data /var/www/logs

In MySQL muß noch eine Datenbank und ein User angelegt werden.

mysql -uroot -p

Hier folgendes eintippen:

create datebase loganalyzer;
GRANT ALL PRIVILEGES ON loganalyzer.* TO 'loganalyzer'@'localhost' IDENTIFIED BY '<PASSWORD>' WITH GRANT OPTION;

Hiernach einfach im Browser die Seite http:<HOSTNAME>/logs aufrufen und den Installer abarbeiten.