Benutzer-Werkzeuge

Webseiten-Werkzeuge


rsyslog

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
rsyslog [2013-05-21 13:38:08] – [Rsyslog] manfredrsyslog [2020-02-12 11:30:00] (aktuell) – [Wichtiges] manfred
Zeile 1: Zeile 1:
 +====== Rsyslog ======
 +
 +  * [[http://www.linux-magazin.de/Heft-Abo/Ausgaben/2008/05/Logangebot]]
 +  * [[http://www.heise.de/netze/artikel/Erweiterte-Systemueberwachung-mit-rsyslog-846750.html]]
 +  * [[http://kb.monitorware.com/rsyslog-f49.html]] - deutsches RSysLog-Forum
 +
 +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!**
 +  - [[https://www.pro-linux.de/news/1/27778/debian-diskutiert-weiter-%C3%BCber-systemd.html|Debian stellt (ab Debian 11 - Vermutlich in Ubuntu 22.04 LTS) das Logging-System standardmäßig von Rsyslog auf Journald aus dem Systemd-Paket um.]]
 +    - Anwender, die es vorziehen, bei Rsyslog oder einer Alternative zu bleiben, erreichen dies durch die Befehle ''journalctl --relinquish-var; rm -rf /var/log/journal''
 +    - //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.//
 +  - 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;
 +
 +  * Log-Host:        localhost
 +  * Log-DB:          Syslog
 +  * Log-DB-User:     rsyslog
 +  * Log-DB-Passwort: geheimes_passwort
 +
 +  # 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 [[http://www.phplogcon.org/|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:
 +
 +  * [[http://wiki.rsyslog.com/index.php/Working_Apache_and_Rsyslog_configuration]]
 +  * [[http://www.oreillynet.com/pub/a/sysadmin/2006/10/12/httpd-syslog.html]]
 +
 +
 +==== funktioniert in der Praxis ====
 +
 +In der Praxis funktioniert das umlenken des Apache-Log ins Syslog so wie hier beschrieben: [[syslog-server#apache_soll_nach_syslog_loggen]]
 +
 +
 +===== Datei nach rsyslog pumpen =====
 +
 +  * [[http://www.rsyslog.com/doc-imfile.html]]
 +
 +
 +===== Links =====
 +
 +  * [[http://wiki.rsyslog.com/index.php/Einstieg:_rsyslog_zu_rsyslog_UDP_/_TCP]]
 +  * [[http://www.heise.de/netze/artikel/Erweiterte-Systemueberwachung-mit-rsyslog-846750.html]]
 +  * [[http://www.phplogcon.org]]
 +  * [[http://httpd.apache.org/docs/2.2/mod/core.html#errorlog]]
 +
 +
 +===== rsyslog modern Configuration =====
 +
 +Konfigurationsdatei bearbeiten
 +  > vi /etc/rsyslog.d/50-default.conf
 +
 +  * **[[https://www.rsyslog.com/doc/v8-stable/configuration/templates.html|rsyslog-Konfiguration mit Vorlagen]]**
 +    * __[[https://www.rsyslog.com/article60/]]__
 +
 +jeder Rechner bekommt seine eigene Log-Datei:
 +  $template        DynaFile,"/var/log/rsyslog/%HOSTNAME%.log"
 +  *.*              -?DynaFile
 +
 +  * **[[https://selivan.github.io/2017/02/07/rsyslog-log-forward-save-filename-handle-multi-line-failover.html#message-processing|moderne rsyslog-Konfiguration mit Entscheidungsfunktionen]]**
 +
 +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
 +