Einen detaillierten Einblick in die Ziele, das Design und die Umsetzung dieses Projekts finden Sie in diesen Blogbeiträgen.
Ekanite ist ein leistungsstarker Syslog-Server mit integrierter Textsuche. Sein Ziel besteht darin, ein paar Dinge zu tun, und zwar gut: Protokollnachrichten über das Netzwerk zu akzeptieren und das Durchsuchen der Nachrichten zu vereinfachen. Was ihm an Funktionalität fehlt, macht er durch die Fokussierung wett. Es ist in Go integriert und weist keine externen Abhängigkeiten auf, was die Bereitstellung vereinfacht.
Zu den Funktionen gehören:
Die Suche wird mithilfe der Bleve-Suchbibliothek implementiert. Eine Leistungsanalyse von Bleve und den von Ekanite verwendeten Sharding-Techniken finden Sie in diesem Beitrag.
Der schnellste Weg, unter OSX und Linux zum Laufen zu kommen, besteht darin, eine vorgefertigte Release-Binärdatei herunterzuladen. Sie finden diese Binärdateien auf der Github-Release-Seite. Nach der Installation können Sie Ekanite wie folgt starten:
ekanited -datadir ~ /ekanite_data # Or any directory of your choice.
Um alle Ekanite-Optionen anzuzeigen, übergeben Sie -h
in der Befehlszeile.
Wenn Sie Ekanite erstellen möchten , weil Sie entweder den neuesten Code benötigen oder keine vorgefertigte Binärdatei für die Plattform verfügbar ist, werfen Sie einen Blick auf CONTRIBUTING.md.
Damit Ekanite Protokolle akzeptiert, muss Ihr Syslog-Client zunächst so konfiguriert sein, dass die Protokollzeilen RFC5424-konform sind und das folgende Format haben:
<PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROC-ID MSGID MSG"
Konsultieren Sie den RFC, um zu erfahren, was jedes dieser Felder ist. Das TIMESTAMP-Feld muss im RFC3339-Format vorliegen. Sowohl rsyslog als auch syslog-ng unterstützen Vorlagen, die es diesen Programmen sehr einfach machen, Protokolle korrekt zu formatieren und an Ekanite zu übertragen. Nachfolgend finden Sie Vorlagen und Installationsanweisungen für beide Systeme.
rsyslog
# Send messages to Ekanite over TCP using the template. Assumes Ekanite is listening on 127.0.0.1:5514
$template Ekanite,"<%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% - %msg%n"
*.* @@127.0.0.1:5514;Ekanite
Fügen Sie diese Vorlage zu /etc/rsyslog.d/23-ekanite.conf
hinzu und starten Sie dann rsyslog mit dem Befehl sudo service rsyslog restart
.
syslog-ng
source s_ekanite {
system(); # Check which OS & collect system logs
internal(); # Collect syslog-ng logs
};
template Ekanite { template("<${PRI}>1 ${ISODATE} ${HOST} ${PROGRAM} ${PID} - $MSGn"); template_escape(no) };
destination d_ekanite {
tcp("127.0.0.1" port(5514) template(Ekanite));
};
log {
source(s_ekanite);
destination(d_ekanite);
};
Fügen Sie diese Vorlage zu /etc/syslog-ng/syslog-ng.conf
hinzu und starten Sie syslog-ng dann mit dem Befehl /etc/init.d/syslog-ng restart
.
Mit diesen Änderungen werden rsyslog oder syslog-ng weiterhin Protokolle an alle vorhandenen Ziele senden und die Protokolle auch an Ekanite weiterleiten.
Die Suchunterstützung ist im Moment ziemlich einfach. Sie haben zwei Möglichkeiten: eine einfache Telnet-ähnliche Schnittstelle und eine browserbasierte Abfrageschnittstelle.
Stellen Sie eine Telnet-Verbindung zum Abfrageserver her (siehe Befehlszeilenoptionen) und geben Sie einen Suchbegriff ein. Bei der unterstützten Abfragesprache handelt es sich um die einfache Sprache, die von bleve unterstützt wird. Möglicherweise wird aber bald auch eine ausgefeiltere Abfragesyntax, einschließlich der Suche nach bestimmten Feldwerten, unterstützt.
Unten sehen Sie beispielsweise eine Beispielsuchsitzung, die Zugriffe auf die Anmelde-URL einer Wordpress-Site zeigt. Der Telnet-Client stellt eine Verbindung zum Abfrageserver her und gibt die Zeichenfolge login
ein
$ telnet 127.0.0.1 9950
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
login
<134>0 2015-05-05T23:50:17.025568+00:00 fisher apache-access - - 65.98.59.154 - - [05/May/2015:23:50:12 +0000] "GET /wp-login.php HTTP/1.0" 200 206 "-" "-"
<134>0 2015-05-06T01:24:41.232890+00:00 fisher apache-access - - 104.140.83.221 - - [06/May/2015:01:24:40 +0000] "GET /wp-login.php?action=register HTTP/1.0" 200 206 "http://www.philipotoole.com/" "Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.17"
<134>0 2015-05-06T01:24:41.232895+00:00 fisher apache-access - - 104.140.83.221 - - [06/May/2015:01:24:40 +0000] "GET /wp-login.php?action=register HTTP/1.1" 200 243 "http://www.philipotoole.com/wp-login.php?action=register" "Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.17"
<134>0 2015-05-06T02:47:54.612953+00:00 fisher apache-access - - 184.68.20.22 - - [06/May/2015:02:47:51 +0000] "GET /wp-login.php HTTP/1.1" 200 243 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17"
<134>0 2015-05-06T04:20:49.008609+00:00 fisher apache-access - - 193.104.41.186 - - [06/May/2015:04:20:46 +0000] "POST /wp-login.php HTTP/1.1" 200 206 "-" "Opera 10.00"
Möglicherweise möchten Sie nur nach POST
Zugriffen auf diese URL suchen:
login -GET
<134>0 2015-05-06T04:20:49.008609+00:00 fisher apache-access - - 193.104.41.186 - - [06/May/2015:04:20:46 +0000] "POST /wp-login.php HTTP/1.1" 200 206 "-" "Opera 10.00"
Ein anspruchsvolleres Kundenprogramm ist geplant.
Die browserbasierte Schnittstelle akzeptiert auch Abfragen im Bleve-Stil, die mit den im Abschnitt Telnet beschriebenen identisch sind. Standardmäßig ist die Browseroberfläche unter http://localhost:8080 verfügbar. Eine Beispielsitzung ist unten dargestellt.
Es stehen grundlegende Statistiken und Diagnosen zur Verfügung. Besuchen Sie http://localhost:9951/debug/vars
um diese Informationen abzurufen. Der Host und der Port können über die Befehlszeilenoption -diag
geändert werden.
Die Architektur unterstützt jetzt die einfache Implementierung neuer Parser über das Standard-Syslog hinaus in drei einfachen Schritten:
input/parser.go
„supportedFormats()“, um den zusätzlichen Standard und Namen zu erfassen.parser/
den neuen Eingabeformat-Parser mit den entsprechenden Regex-Anweisungen.timestamp
enthält, z. B. 2006-01-02T15:04:05Z07:00
input/parser.go
aktualisieren Sie NewParser(), um den neuen Eingabeformat-Parser ordnungsgemäß zu instanziieren. Das Projekt wird nicht aktiv gepflegt, es kann jedoch sein, dass es in Zukunft erneut weiterentwickelt wird.