Senden von Subversion-Protokollen an Logstash

Senden von Subversion-Protokollen an Logstash

Meine Anforderung besteht darin, Subversion-Protokolle (z. B. Benutzername, Revisionsnummer usw.) zur Analyse an Logstash zu senden (sie dann in Elastic Search zu speichern und schließlich über Kibana anzuzeigen). Da Subversion eine eigene dateibasierte Datenbank (FSFS) und keine reine Textdatei verwendet, habe ich zwei Möglichkeiten

  1. Führen Sie svn log über cron aus (im 1-Minuten-Intervall) und senden Sie die Datei dann an logstash (wirklich eine schlechte Idee).
  2. Habe das Subversion River-Plugin verwendet. Ich habe es ausprobiert und es funktioniert nicht, da es die Daten überhaupt nicht indizieren kann. Seine Entwicklung wurde vor fast einem Jahr eingestellt. Also überhaupt keine Hilfe.

Ich habe auch über ein Post-Commit-Skript nachgedacht, das bei jedem Check-in eines Benutzers ausgelöst wird und dann die Protokolle in einer Textdatei speichert, aber es ist dasselbe wie Punkt 1.

Jede Hilfe/Idee hierzu ist herzlich willkommen.

BEARBEITEN

Wir schreiben dieses kleine Post-Commit, wie ich in Punkt 3 erwähnt habe, damit wir bei jedem Benutzer-Check-in die Metadaten in einer Datei speichern und dieses Protokoll dann per Syslog auf den Logstash-Server übertragen können. Einer der größten Nachteile dieses Ansatzes besteht darin, dass ich mit TB an Daten und über 15 Check-ins pro Minute arbeite. Diese Datei wird wirklich groß (wir können Logrotate verwenden), aber gleichzeitig tritt ein Sperrproblem auf (da mehrere Benutzer versuchen, einzuchecken und in dieselbe Datei zu schreiben), was letztendlich zu einem Race Condition führt und die Situation noch schlimmer macht. Ich füge unten einen Post-Commit-Hook ein, damit er für andere Leute nützlich sein kann.

 #!/bin/sh

 REPOS="$1"
 REV="$2"

 LOG="/tmp/svn.log"

 var1=/usr/bin/svnlook info -r $REV $REPOS | tr '\n' '|'`
 var2=/usr/bin/svnlook changed -r $REV $REPOS | tr '\n' ' '`
 echo "r${REV}|${var1}|${var2}\n" | tee -a ${LOG} 2>&1
 echo " " | tee -a ${LOG} 2>&1

Antwort1

Ich sehe mindestens eine praktische Option: 1) Leiten Sie Ihre SVN-Protokolle an Syslog weiter. Die meisten Distributionen verwenden mittlerweile Rsyslog. Hier ist also ein Beispiel für Rsyslog (5.x):

$InputFileName /${path_to}/svn.log
$InputFileTag svn:
$InputFileStateFile /var/spool/rsyslog/svn_log

$InputFileSeverity notice
$InputFileFacility local7
$InputRunFileMonitor

:syslogtag, isequal, "svn:" @@${IP_of_logstash}:$PORT
&~

Bitte beachten Sie, dass die Konfiguration bei neueren Versionen von rsyslog anders ist. Konfiguration für Version 8.x:

#reading SVN logs
input(type="imfile" File="/var/log/${path_to}/svn.log"
Tag="svn:"
StateFile="/var/spool/rsyslog/svn_log"
Severity="normal"
Facility="local7")

:syslogtag, isequal, "svn:" @@${IP_of_logstash}:$PORT
&~

2) Konfigurieren Sie den Logstash-Syslog-Listener und -Parser für Protokolle

In diesem Fall werden Protokolle nicht zusätzlich im Syslog gespeichert, sondern direkt an Logstash weitergeleitet und der Syslog-Transport kümmert sich darum.

Antwort2

Eine Möglichkeit könnte darin bestehen, Syslog so zu konfigurieren, dass die Subversion-Protokolle akzeptiert und an Logstash gesendet werden.

Nützliche Links

http://logstash.net/docs/1.1.9/outputs/syslog

http://linux.die.net/man/5/syslog.conf

http://www.commandlinefu.com/commands/view/11687/send-apache-log-to-syslog-ng

verwandte Informationen