Inhaltsverzeichnis

Rsyslog

Rsyslog ist vollständig kompatibel zum normalen sysklogd und kann als 1:1-Ersatz dienen, da es ursprünglich auch von ihm abstammt. Seine fortgeschrittenen Möglichkeiten legen seinen Einsatz in unternehmensweiten, durch Verschlüsselung geschützten syslog-Weiterleitungsketten nahe. Gleichzeitig bleibt seine Einrichtung auch für den neuen, unerfahrenen Benutzer einfach.

Wichtiges

ACHTUNG!

    1. Anwender, die es vorziehen, bei Rsyslog oder einer Alternative zu bleiben, erreichen dies durch die Befehle journalctl –relinquish-var; rm -rf /var/log/journal
    2. Nach der Bekanntgabe der Änderung entspann sich schnell eine noch anhaltende Diskussion, die größtenteils eine ablehnende Haltung gegen diese Entscheidung annahm. … Ein weiterer Kritikpunkt bezieht sich auf das binäre Format der Journald-Protokolle. In der Vergangenheit waren vereinzelt Protokolle nach Korruption des Dateisystems oder nach Abstürzen inkonsistent oder nicht mehr lesbar. Laut Biebl soll das mittlerweile nicht mehr vorkommen, da Journald beim Erkennen korrupter Logs ein neues Journal anlegt. Ein Entwickler fragte zudem, ob er den Entscheidungsprozess oder die Umfrage im Vorfeld dieser Entscheidung verpasst habe.
  1. Wenn das MySQL-Back-End hinter dem RSyslog-Server ausgefallen ist, kann es passieren, dass die Log-Daten von den RSyslog-Clienten an den RSyslog-Server übergeben werden und dann im Nirvana landen. Will man die Log-Daten behalten, muss der RSyslog-Server-Dienst auf dem Log-Server angehalten werden und darf erst wieder gestartet werden, wenn das MySQL-Back-End (MySQL auf dem Log-Server) wieder ordentlich läuft!

Allgemeines

Die Leute von Rsyslog sind recht aktiv, auch der Rsyslog kann Logdaten per TCP senden und empfangen. Erst sorgen wir mal für einen aktuellen Stand der Pakete auf dem System:

# aptitude update && aptitude -y safe-upgrade

Im allgemeinen werden diese Anpassungen in der /etc/rsyslog.conf vorgenommen.

Bei Ubuntu werden die Anpassungen für den rsyslog-Client in der /etc/rsyslog.d/50-default.conf vorgenommen, diese Datei wird von der /etc/rsyslog.conf importiert.

Für den rsyslog-Server werden die Anpassungen bei Ubuntu auch in der /etc/rsyslog.conf vorgenommen und die /etc/rsyslog.d/50-default.conf kann auf dem rsyslog-Server gelöscht werden.

Am Ende darf man den Restart des Dienstes nicht vergessen!

# /etc/init.d/rsyslog restart

Wichtig ist hier, dass reload des Dienstes nicht ausreicht und zwingend ein restart erforderlich ist!

In den folgenden Beispielen habe ich den Hostnamen logserver für den Log-Server verwendet, selbstverständlich ist es auch möglich die entsprechende IP des Log-Server's zu verwenden.

Sender (Client)

# aptitude -y install rsyslog

senden via UDP

Hier gehen Pakete bei hoher Netzwerk- bzw. Systemlast verloren und ebenso gibt es Paketverlusst, wenn der Logserver nicht erreichbar ist. Früher ging das nicht anders…

*.*                   @logserver

Das will man nicht, es sei denn, dass man es aus Kompatibilitätsgründen machen muss.

senden via TCP

Bei dieser verbesserten Methode gehen zwar keine Pakete mehr übers Netz verloren aber leider gibt es immer noch den Paketverlusst, wenn der Logserver nicht erreichbar ist.

*.*                   @@logserver

senden via RELP

Bei dieser neuesten Methode gehen keine Pakete mehr übers Netz verloren. Auch wenn der Logserver nicht erreichbar ist, gehen die Pakete nicht verloren, sondern werden auf dem Client zwischengespeichert.

# aptitude -y install rsyslog-relp
# mkdir /var/spool/rsyslog/
# chown syslog:syslog /var/spool/rsyslog/
# chmod 0700 /var/spool/rsyslog/

Standard:

# vi /etc/rsyslog.conf

Ubuntu (Datei überschreiben, nicht anhängen):

# vi /etc/rsyslog.d/50-default.conf
$ModLoad omrelp                       # lade das relp-Modul für verlustfreie Ausgabe
$WorkDirectory /var/spool/rsyslog/    # Verzeichnis für die spool-Dateien
$ActionQueueType LinkedList           # eigenen Prozess aufmachen
#$ActionQueueDequeueTimeBegin 1       # ab jetzt alle gelagerten Log's in die DB schieben
#$ActionQueueDequeueTimeEnd 4         # ab jetzt Verbindung zur DB trennen
$ActionQueueFileName temp_relp_logs   # Dateinamenbasis unter der die Log's gelagert werden
$ActionResumeRetryCount -1            # unendlich lange auf den Log-Server warten
$ActionQueueSaveOnShutdown on         # Log's zwischenspeichern, wenn der Dienst gestop't wird
*.*   :omrelp:logserver:2514          # alles ins Log

Mit den Optionen "$ActionQueueDequeueTimeBegin 1" und "$ActionQueueDequeueTimeEnd 4" (hier deaktiviert) kann man noch fest legen, dass am Tag die Log's lokal zwischengespeichert werden und nur in der Zeit zwischen "1 Uhr" und "4 Uhr" werden die gespeicherten Log's auf den Log-Server übertragen.

Platte voll

Wenn die Verbindung zum Logserver unterbrochen ist, werden die Logdaten wunschgemäß im Dateisystem gespeichert.

Ist die Verbindung zum Logserver zu lange unterbrochen, dann kann es passieren, dass die lokal zwischen gespeicherten Logdaten die entsprechende Partition komplett zu schreiben.

Das hat fast immer zur Folge, dass eine Query-Index-Datei (z.B.: "/var/spool/rsyslog/temp_relp_logs.qi") erstellt wird.

Diese Datei besagt, das Logdaten verlohren gegangen sind… Solange diese Datei dort liegt, werden keine Logdaten zum Logserver geschickt.

Lösung:

# rm /var/spool/rsyslog/temp_relp_logs.qi
# /etc/init.d/rsyslog restart
# netstat -a | fgrep 2514
tcp       17      0 meinserver:38660 logserver:2514 ESTABLISHED

Jetzt werden wieder Logdaten zum Logserver geschickt, allerdings bleiben die zwischen gespeicherten Logdaten leider auch im Spool-Verzeichnis liegen… :-(

Diese zwischen gespeicherten Logdaten liegen in einem speziellen Format vor:

<Obj:1:msg:1:
+iProtocolVersion:2:1:0:
+iSeverity:2:1:5:
+iFacility:2:2:23:
+msgFlags:2:1:4:
+ttGenTime:2:10:1314710683:
+tRcvdAt:3:35:0:2011:8:30:15:24:43:978339:6:+:2:0:
+tTIMESTAMP:3:35:0:2011:8:30:15:24:43:978339:6:+:2:0:
+pszRawMsg:1:93:<189>Aug 30 15:24:43 Apache2_www.domain.de: [    0.307756]   alloc irq_desc for 27 on node -1:
+pszMSG:1:50: [    0.307756]   alloc irq_desc for 27 on node -1:
+pszUxTradMsg:1:88:Aug 30 15:24:43 Apache2_www.domain.de: [    0.307756]   alloc irq_desc for 27 on node -1:
+pszTAG:1:22:Apache2_www.domain.de::
+pszHOSTNAME:1:11:tttest01:
+pszInputName:1:8:imuxsock:
+pszRcvFrom:1:11:tttest01:
+pszRcvFromIP:1:9:127.0.0.1:
>End
.

Will man diese Logdaten irgendwie noch nutzen, am besten in die LogDB auf dem Logserver schicken, dann kommt man um eine Umwandlung nicht rum!

/root/bin/temp_relp_logs2db.sh

Die letzte Möglichkeit, die Logdaten jetzt noch in die DB zu bekommen, ist "Handarbeit".

Dazu habe ich ein kleines Script geschrieben:

#!/bin/bash

VERSION="v2011083101"
SCRNAME="$(basename ${0})"
VERZ="${1}"
DATEIEN="*"

if [ -z "${VERZ}" ] ; then
        echo "${0} /var/spool/rsyslog/ | egrep -v '^#' | mysql -hlogserver -uroot -p Syslog"
        echo "${0} /var/spool/rsyslog/temp_relp_logs.00000037 | egrep -v '^#' | mysql -hlogserver -uroot -p Syslog"
        echo "oder beispielsweise so"
        echo "${0} /var/spool/rsyslog/ > temp_relp_logs.sql"
        echo "cat temp_relp_logs.sql | egrep -v '^#' | mysql -hlogserver -uroot -p Syslog"
        exit 1
fi

if [ ! -d "${VERZ}" ] ; then
	if [ -r "${VERZ}" ] ; then
		DATEIEN="$(basename ${VERZ})"
		VERZ="$(dirname ${VERZ})"
	else
        	echo 'Datei oder Verzeichnis existiert nicht. ABBRUCH!'
        	exit 1
	fi
fi

cd ${VERZ} || exit 1
for DATEI in ${DATEIEN}
do
        echo "# Beginn: ${DATEI}"
        rm -f /tmp/${SCRNAME}.tmp
        cat "${DATEI}" | sed 's#^[<+>]##;s#[:][[:alnum:]]*[:][[:alnum:]]*[:]# #;s#:$##;s#[.]"#.#' | egrep -v '^End$' | while read LOGVAR LOGDATEN
        do
                if [ "${LOGVAR}" == "." ] ; then
                        Priority="6"
                        GenericFileName="${SCRNAME} ${VERSION}"

                        echo "INSERT INTO SystemEvents (ReceivedAt,DeviceReportedTime,Facility,Priority,FromHost,Message,NTSeverity,InfoUnitID,SysLogTag,GenericFileName) VALUES ('${ReceivedAt}','${DeviceReportedTime}','${Facility}','${Priority}','${FromHost}','${Message}','${NTSeverity}','${InfoUnitID}','${SysLogTag}','${GenericFileName}');"

                        ReceivedAt=""
                        DeviceReportedTime=""
                        Facility=""
                        Priority=""
                        FromHost=""
                        Message=""
                        NTSeverity=""
                        InfoUnitID=""
                        SysLogTag=""
                        GenericFileName=""
                else
                        case "${LOGVAR}" in
                                tRcvdAt)
                                        ReceivedAt="$(date -d"$(echo "${LOGDATEN}"|awk -F':' '{print $2"-"$3"-"$4,$5":"$6":"$7}')" +'%F %T')"
                                        ;;
                                tTIMESTAMP)
                                        DeviceReportedTime="$(date -d"$(echo "${LOGDATEN}"|awk -F':' '{print $2"-"$3"-"$4,$5":"$6":"$7}')" +'%F %T')"
                                        ;;
                                iFacility)
                                        Facility="${LOGDATEN}"
                                        ;;
                                pszRcvFrom)
                                        FromHost="${LOGDATEN}"
                                        ;;
                                pszMSG)
                                        Message="$(echo "${LOGDATEN}"|sed "s/'/\\\\'/")"
                                        ;;
                                iSeverity)
                                        NTSeverity="${LOGDATEN}"
                                        ;;
                                Obj)
                                        InfoUnitID="${LOGDATEN}"
                                        ;;
                                pszTAG)
                                        SysLogTag="${LOGDATEN}"
                                        ;;
                        esac
                fi
        done
        echo "# Ende: ${DATEI}"
done

Dieses Script wandelt die zwischen gespeicherten Logdaten in SQL-Queries um, und kann z.B. so benutzt werden:

# /root/bin/temp_relp_logs2db.sh /var/spool/rsyslog/ | egrep -v '^#' | mysql -hlogserver -uroot -p Syslog

Damit man die Daten, die mit Hilfe von diesem Script in die DB geschoben wurden, von den anderen auseinander halten kann, schreibt dieses Script den Scriptnamen sowie seine Version in das DB-Feld "GenericFileName". Dieses Feld ist "NULL", wenn der rsyslog den Datensatz in die DB geschrieben hat.

Empfänger (Server)

# aptitude -y install rsyslog

Zuerst muss, falls eine Firewall aktiviert ist, der Port 514 (2514 für RELP) freigegeben werden. (Bei Benutzern von Fedora 9 kann es zu Problemen, kommen wenn die Firewall deaktiviert ist! Also lieber aktiviert lassen und den Port freigeben.)

empfangen via UDP

$ModLoad imudp.so
$UDPServerRun 514

empfangen via TCP

$ModLoad imtcp.so
$InputTCPServerRun 514

empfangen via RELP

# aptitude -y install rsyslog-relp

Jetzt muss die Konfiguration in folgender Weise ergänzt werden.

# vi /etc/rsyslog.conf

Das steht schon drin:

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514

Und das schreiben wir direkt darunter:

$ModLoad imrelp
$InputRELPServerRun 2514

Logdaten in eine MySQL-DB schreiben

Auf dem Log-Server müssen noch folgende Änderungen vorgenommen werden, um die Log-Daten in eine MySQL-DB schreiben zu lassen.

# aptitude update && aptitude -y safe-upgrade
# aptitude -y install rsyslog-mysql

Die folgenden Schritte sind auf Ubuntu nicht nötig, da sie bei der Installation automatisch abgefragt werden.

# mysqladmin -u root password geheimes_passwort
# mysql -u root -p < /usr/share/doc/rsyslog-mysql/createDB.sql
GRANT ALL ON Syslog.* to rsyslog@localhost identified by 'geheimes_passwort'; flush privileges;
# vi /etc/rsyslog.d/mysql.conf
$ModLoad ommysql.so
*.* :ommysql:localhost,Syslog,rsyslog,geheimes_passwort

Zur Sicherheit zeige ich hier nochmal die DB-Struktur:

Erstellt wurde si mit:

# mysqldump -d -ursyslog -p Syslog > Syslog.sql
-- MySQL dump 10.13  Distrib 5.1.41, for debian-linux-gnu (x86_64)
--
-- Host: localhost    Database: Syslog
-- ------------------------------------------------------
-- Server version	5.1.41-3ubuntu12.10

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `SystemEvents`
--

DROP TABLE IF EXISTS `SystemEvents`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `SystemEvents` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `CustomerID` bigint(20) DEFAULT NULL,
  `ReceivedAt` datetime DEFAULT NULL,
  `DeviceReportedTime` datetime DEFAULT NULL,
  `Facility` smallint(6) DEFAULT NULL,
  `Priority` smallint(6) DEFAULT NULL,
  `FromHost` varchar(60) DEFAULT NULL,
  `Message` text,
  `NTSeverity` int(11) DEFAULT NULL,
  `Importance` int(11) DEFAULT NULL,
  `EventSource` varchar(60) DEFAULT NULL,
  `EventUser` varchar(60) DEFAULT NULL,
  `EventCategory` int(11) DEFAULT NULL,
  `EventID` int(11) DEFAULT NULL,
  `EventBinaryData` text,
  `MaxAvailable` int(11) DEFAULT NULL,
  `CurrUsage` int(11) DEFAULT NULL,
  `MinUsage` int(11) DEFAULT NULL,
  `MaxUsage` int(11) DEFAULT NULL,
  `InfoUnitID` int(11) DEFAULT NULL,
  `SysLogTag` varchar(60) DEFAULT NULL,
  `EventLogType` varchar(60) DEFAULT NULL,
  `GenericFileName` varchar(60) DEFAULT NULL,
  `SystemID` int(11) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Table structure for table `SystemEventsProperties`
--

DROP TABLE IF EXISTS `SystemEventsProperties`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `SystemEventsProperties` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `SystemEventID` int(11) DEFAULT NULL,
  `ParamName` varchar(255) DEFAULT NULL,
  `ParamValue` text,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

-- Dump completed on 2011-08-30 16:44:32

Jetzt noch den Log-Dienst neu starten:

# /etc/init.d/rsyslog restart

Die ersten Einträge kann man sich zum Beispiel so ansehen:

# echo "SELECT ID,DeviceReportedTime,Facility,FromHost,Message,SysLogTag FROM SystemEvents LIMIT 20;" | mysql -t -u rsyslog -pgeheimes_passwort Syslog

Die letzten Einträge kann man sich zum Beispiel so ansehen:

# echo "SELECT ID,DeviceReportedTime,Facility,FromHost,Message,SysLogTag FROM SystemEvents ORDER BY ID DESC LIMIT 20;" | mysql -t -u rsyslog -pgeheimes_passwort Syslog

Anzeige der Anzahl der Einträge pro Maschine:

# echo "SELECT FromHost,COUNT(*) FROM SystemEvents GROUP BY FromHost ORDER BY FromHost" | mysql -t -u rsyslog -p Syslog

DB von überall abfragen

Die Log's werden nun in die DB und in die Dateien geschrieben, das wollen wir nicht, ist ja doppelt gemoppelt.

Also schalten wir das schreiben in die Dateien ab, und das geht ganz einfach:

# echo "" > /etc/rsyslog.d/50-default.conf
# /etc/init.d/rsyslog restart

Ferti!

DB von überall abfragen

Soll es möglich sein, dass die SELECT-Abfragen auch von anderen Host's möglich sind, dann ist es nötig, dass wir die Bindung an "localhost" für die MySQL-DB entfernen.

# vi /etc/mysql/my.cnf

von

bind-address            = 127.0.0.1

in

#bind-address           = 127.0.0.1

ändern.

Jetzt noch die DB neu starten:

# /etc/init.d/mysql restart

hilfreiche Abfrage-Scripte

bin/ls_logs.sh
#!/bin/bash

LIMIT="50"

BENUTZER="$(awk -F',' '/,Syslog,/ {print $(NF-1)}' /etc/rsyslog.d/mysql.conf)"
PASSWORT="$(awk -F',' '/,Syslog,/ {print $NF}' /etc/rsyslog.d/mysql.conf)"

echo "SELECT ID,DeviceReportedTime,Facility,FromHost,Message,SysLogTag FROM SystemEvents ORDER BY ID DESC LIMIT ${LIMIT};" | mysql -t -u${BENUTZER} -p${PASSWORT} Syslog
bin/ls_logs_hosts.sh
#!/bin/bash

LIMIT="50"

BENUTZER="$(awk -F',' '/,Syslog,/ {print $(NF-1)}' /etc/rsyslog.d/mysql.conf)"
PASSWORT="$(awk -F',' '/,Syslog,/ {print $NF}' /etc/rsyslog.d/mysql.conf)"

echo "SELECT FromHost,COUNT(*) FROM SystemEvents GROUP BY FromHost ORDER BY FromHost;" | mysql -t -u${BENUTZER} -p${PASSWORT} Syslog
bin/ls_host_logs.sh
#!/bin/bash

if [ -z "${1}" ] ; then

echo "${0} [Hostname]"

else

LIMIT="50"

BENUTZER="$(awk -F',' '/,Syslog,/ {print $(NF-1)}' /etc/rsyslog.d/mysql.conf)"
PASSWORT="$(awk -F',' '/,Syslog,/ {print $NF}' /etc/rsyslog.d/mysql.conf)"

echo "SELECT ID,DeviceReportedTime,Facility,FromHost,Message,SysLogTag FROM SystemEvents WHERE FromHost='${1}' ORDER BY ID DESC LIMIT ${LIMIT};" | mysql -t -u${BENUTZER} -p${PASSWORT} Syslog

fi
bin/ls_apache_logs.sh
#!/bin/bash


LIMIT="50"

BENUTZER="$(awk -F',' '/,Syslog,/ {print $(NF-1)}' /etc/rsyslog.d/mysql.conf)"
PASSWORT="$(awk -F',' '/,Syslog,/ {print $NF}' /etc/rsyslog.d/mysql.conf)"

echo "SELECT ID,DeviceReportedTime,Facility,FromHost,Message,SysLogTag FROM SystemEvents WHERE Message LIKE '%apache2_%' ORDER BY ID DESC LIMIT ${LIMIT};" | mysql -t -u${BENUTZER} -p${PASSWORT} Syslog
bin/ls_apache-error_logs.sh
#!/bin/bash


LIMIT="50"

BENUTZER="$(awk -F',' '/,Syslog,/ {print $(NF-1)}' /etc/rsyslog.d/mysql.conf)"
PASSWORT="$(awk -F',' '/,Syslog,/ {print $NF}' /etc/rsyslog.d/mysql.conf)"

echo "SELECT ID,DeviceReportedTime,Facility,FromHost,Message,SysLogTag FROM SystemEvents WHERE SysLogTag LIKE '%apache%' ORDER BY ID DESC LIMIT ${LIMIT};" | mysql -t -u${BENUTZER} -p${PASSWORT} Syslog

hilfreiche Wartungs-Scripte

/root/etc/lock.env
#
# damit das Script inie mehrfach laeuft
#

SCRIPT="$(/usr/bin/basename ${0})"

if [ -e /tmp/${SCRIPT}.lock ] ; then
      echo "${SCRIPT}.lock läuft schon. ABBRUCH!"
      exit
else
      # Lock Beginn
      echo "Beginn: $(date +'%F %T')" >> /tmp/${SCRIPT}.lock
fi

LOCKENDE()
{
      cat /tmp/${SCRIPT}.lock
      echo "Ende: $(date +'%F %T')"
      rm -frv /tmp/${SCRIPT}.lock
}
loeschen_alte_logs.sh
#!/bin/bash

ALTER="30"

. /root/etc/lock.env

BENUTZER="$(awk -F',' '/,Syslog,/ {print $(NF-1)}' /etc/rsyslog.d/mysql.conf)"
PASSWORT="$(awk -F',' '/,Syslog,/ {print $NF}' /etc/rsyslog.d/mysql.conf)"

echo "DELETE FROM SystemEvents WHERE DeviceReportedTime < '$(date -d-${ALTER}days +'%F %T')';" | mysql -t -u${BENUTZER} -p${PASSWORT} Syslog
loeschen_apache_logs.sh
#!/bin/bash

ALTER="7"

. /root/etc/lock.env

BENUTZER="$(awk -F',' '/,Syslog,/ {print $(NF-1)}' /etc/rsyslog.d/mysql.conf)"
PASSWORT="$(awk -F',' '/,Syslog,/ {print $NF}' /etc/rsyslog.d/mysql.conf)"

echo "DELETE FROM SystemEvents WHERE DeviceReportedTime < '$(date -d-${ALTER}days +'%F %T')' AND SysLogTag LIKE 'apache2_%';"  | mysql -t -u${BENUTZER} -p${PASSWORT} Syslog
/root/bin/delete_logs_7d.sh
#!/bin/bash

. /root/etc/lock.env

for i in `find /data -mtime +7 -type f | egrep -v "\.txt$|\.count$|\.php$|\.pl$|\.plx$|\.sql$|\.method$"`; do rm $i; done

LOCKENDE
/root/bin/mysqlcheck.sh
#!/bin/bash

BENUTZER="$(awk -F',' '/,Syslog,/ {print $(NF-1)}' /etc/rsyslog.d/mysql.conf)"
PASSWORT="$(awk -F',' '/,Syslog,/ {print $NF}' /etc/rsyslog.d/mysql.conf)"

. /root/etc/lock.env

mysqlcheck --repair -u${BENUTZER} -p${PASSWORT} Syslog
mysqlcheck --analyze -u${BENUTZER} -p${PASSWORT} Syslog
mysqlcheck --optimize -u${BENUTZER} -p${PASSWORT} Syslog

LOCKENDE
/etc/cron.daily/mysqlwartung
/root/bin/loeschen_alte_logs.sh ; /root/bin/loeschen_apache_logs.sh ; /root/bin/delete_logs_7d.sh ; /root/bin/mysqlcheck.sh ;

rsyslog-Einträge im Browser

Wer sich nicht mit SQL-Syntax beschäftigen mag und auch keine Lust hat, Textdateien zu durchforsten, für den steht mit PHPLogCon ein praktisches Tool zur Verfügung, das die rsyslog-Einträge übersichtlich aufbereitet und umfassende Suchfunktionen bietet. Das Helferlein liegt den meisten Distributionen fertig paketiert bei und erwartet nur einen installierten Apache-Server und PHP5. Nach der Installation des Distributionspakets dirigieren Sie Ihren Browser zur Adresse http://127.0.0.1/phplogcon/. Da der LogGestalter noch nicht konfiguriert ist, erhalten Sie nur die Möglichkeit, den Installationsassistenten des Tools zu starten. Er überprüft zunächst seine Einstellungsdatei auf korrekt gesetzte Rechte und leitet Sie danach durch seine Einrichtung. Entscheidend ist Schritt 7, in dem Sie PHPLogCon mitteilen, wo es die Protokolle von rsyslog findet. Liegen sie in einer MySQL-Datenbank, wählen Sie die Option „native mysql“ und hinterlegen Datenbankname, Datenbanknutzer sowie dessen Passwort. Soll PHPLogCon lokal gespeicherte Logs im Textformat auswerten, ist „file“ die richtige Option.

Den Hinweis im letzten Schritt, die Datei /var/www/phplogcon/install.php zu löschen, sollten Sie ignorieren. Verschieben Sie sie stattdessen an einen anderen Ort, damit Sie später noch mal darauf zugreifen können, etwa weil Sie doch Logs in einem anderen Format auswerten wollen. Um den Installer erneut zu starten, müssen Sie zuvor die Datei /etc/phplogcon/config.php leeren, da das Skript install.php sonst die Arbeit verweigert.

Einmal eingerichtet, erreichen Sie über die Adresse http://127.0.0.1/phplogcon/ die Hauptansicht der Log-Anzeige per Browser. Standardmäßig sehen Sie dort alle Einträge in Tabellenform, je 50 pro Seite. Diesen Wert können Sie auf bis zu 500 hinaufsetzen. Darüber hinaus stehen Ihnen einige vordefinierte Filter zur Verfügung. So zeigt PHPLogCon auf Wunsch nur die Einträge des letzten Tages oder der letzten Stunde an oder beschränkt seine Ausgabe auf Fehler (Error) und Warnungen (Warning). Einen Gag und eine Parodie auf Googles Button „I’m feeling lucky“ haben die Entwickler mit der Suche „I’d like to feel sad“ eingebaut, die nur Meldungen anzeigt, die das Wort „error“ enthalten. Nett ist die Auto-Reload-Option, die die Ansicht alle paar Sekunden oder Minuten automatisch aktualisiert. Vordefiniert sind Zeiträume von 5 Sekunden bis 30 Minuten.

Noch mehr Filtermöglichkeiten erhalten Sie mit der erweiterten Suche direkt neben dem Suchfeld. Damit die Suche nach LogFacilities wie Mail und Auth dort zum Erfolg führt, sollten Sie die Ansicht zuvor auf „SyslogFields“ umstellen. Auf der erweiterten Suchseite können Sie dann eine oder mehrere Log-Facilities und Prioritäten auswählen. Außerdem gibt es die Option, einen Suchzeitraum zu definieren, den SyslogTag auszuwählen sowie einen Suchbegriff in ein Freitextfeld einzugeben.

Auf der Hauptseite erscheint dann im Suchfeld auch die Syntax der erweiterten Suche, die sich mit den richtigen Suchbegriffen auch über die Hauptseite anwerfen lässt. So fischt der Suchbegriff facility:0,2,4 severity:3 alle Kernel-, Mail- und Auth-Meldungen mit Error-Status aus den Systemprotokollen heraus. Wer in einer Datenbank die Protokolle mehrerer Rechner verwaltet, kann außerdem nach Rechnernamen filtern, um gezielt einzelne PCs zu überwachen.

Gerade im Zusammenspiel mit der übersichtlichen Aufbereitung der Daten durch PHPLogConf bringt rsyslog nicht nur Serveradmins, sondern auch normalen Nutzern mit mehreren Rechnern eine ganze Menge Vorteile beim Verwalten von Log-Dateien. Die ausgezeichnete Dokumentation im Wiki mit vielen Beispielen (siehe unten stehenden Link) hilft bei Problemen weiter und liefert Anregungen für eigene Lösungen. Administratoren, die in heterogenen Netzen arbeiten, können mit Hilfe eines EventLogtoSyslog-Clients auch Windows-Systemprotokolle an rsyslog verfüttern. Über den unten stehenden Link finden Sie eine Reihe freier und kommerzieller Programme, die Sie dafür auf Windows-Seite verwenden können.

Apache soll nach rsyslog loggen

versagt in der Praxis

Diese Variante wird hier nur der Vollständigkeit gezeigt werden.

Die Direktive ErrorLog bestimmt den Namen der Datei, in welcher der Server alle auftretenden Fehler protokolliert. Wenn Dateiname nicht absolut ist, wird er relativ zu ServerRoot betrachtet.

Die Verwendung von syslog anstelle eines Dateinamens aktiviert die Protokollierung mittels syslogd(8), sofern das System es unterstützt. Als Voreinstellung wird der syslog-Typ (syslog facility) local7 verwendet, Sie können dies jedoch auch überschreiben, indem Sie die Syntax syslog:facility verwenden, wobei facility einer der Namen sein kann, die üblicherweise in syslog(1) dokumentiert sind.

ErrorLog syslog:local7

For example, if you wanted to log only critical errors to a particular file, add the line in your /etc/rsyslog.conf file:

local7.crit   /var/log/apache.crit

The access logs are a bit trickier. They don't have a built-in syslog function, but do accept pipes. A quick perl script based off of O'Reilly's article and installed in /usr/local/sbin/apache_syslog does the trick:

funktioniert in der Praxis

In der Praxis funktioniert das umlenken des Apache-Log ins Syslog so wie hier beschrieben: apache_soll_nach_syslog_loggen

Datei nach rsyslog pumpen

rsyslog modern Configuration

Konfigurationsdatei bearbeiten

> vi /etc/rsyslog.d/50-default.conf

jeder Rechner bekommt seine eigene Log-Datei:

$template        DynaFile,"/var/log/rsyslog/%HOSTNAME%.log"
*.*              -?DynaFile

es wird von allen Rechnern ins Log geschrieben, nur vom testrechner01 nicht:

if ($fromhost != 'testrechner01')
then {  
        action(type="omfile" file="/var/log/rsyslog/syslog")
        stop
}

es wird vom testrechner01 in eine spezielle Log-Datei geschrieben, alle anderen schreiben weiterhin ins Standard-Log:

if ($fromhost == 'testrechner01')
then {  
        action(type="omfile" file="/var/log/test/syslog")
        stop
} else {
        action(type="omfile" file="/var/log/rsyslog/syslog")
        stop
}

Nicht vergessen, die neuen Log-Dateien auch ins LogRotate einzutragen!

> vi /etc/logrotate.d/rsyslog