このプロジェクトの目標、設計、実装の詳細については、これらのブログ投稿を確認してください。
Ekanite は、テキスト検索が組み込まれた高性能 syslog サーバーです。その目標は、いくつかのことを実行し、それらを適切に実行することです。つまり、ネットワーク経由でログ メッセージを受け入れ、メッセージの検索を容易にすることです。機能に欠けているものは、焦点が合っていることで補われます。 Go に組み込まれているため、外部依存関係がないため、デプロイが簡単です。
特徴は次のとおりです。
検索は、bleve 検索ライブラリを使用して実装されます。 Bleve のパフォーマンス分析と、Ekanite で使用されるシャーディング技術については、この投稿を参照してください。
OSX および Linux で実行する最も簡単な方法は、事前に構築されたリリース バイナリをダウンロードすることです。これらのバイナリは、Github リリース ページで見つけることができます。インストールしたら、次のように Ekanite を起動できます。
ekanited -datadir ~ /ekanite_data # Or any directory of your choice.
すべての Ekanite オプションを表示するには、コマンド ラインで-h
を渡します。
最新のコードが必要な場合、またはプラットフォーム用の事前に構築されたバイナリが利用できないためにEkanite を構築したい場合は、CONTRIBUTING.md を見てください。
現時点では、Ekanite がログを受け入れるには、ログ行が RFC5424 に準拠し、次の形式になるように syslog クライアントを構成する必要があります。
<PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROC-ID MSGID MSG"
これらの各フィールドが何であるかについては、RFC を参照してください。 TIMESTAMP フィールドは RFC3339 形式である必要があります。 rsyslog と syslog-ng はどちらもテンプレートをサポートしているため、これらのプログラムがログを正しくフォーマットして Ekanite に送信することが非常に簡単になります。両方のシステムのテンプレートとインストール手順は以下のとおりです。
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
このテンプレートを/etc/rsyslog.d/23-ekanite.conf
に追加し、コマンドsudo service rsyslog restart
を使用して rsyslog を再起動します。
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);
};
このテンプレートを/etc/syslog-ng/syslog-ng.conf
に追加し、 /etc/init.d/syslog-ng restart
コマンドを使用して syslog-ng を再起動します。
これらの変更を適用すると、rsyslog または syslog-ng は既存の宛先にログを送信し続け、またログを Ekanite に転送します。
現時点では、検索サポートは非常にシンプルです。シンプルな Telnet のようなインターフェイスと、ブラウザベースのクエリ インターフェイスの 2 つのオプションがあります。
クエリ サーバーに Telnet で接続し (コマンド ライン オプションを参照)、検索語を入力します。サポートされているクエリ言語は、bleve でサポートされている単純な言語ですが、特定のフィールド値の検索を含む、より洗練されたクエリ構文が間もなくサポートされる可能性があります。
たとえば、以下は Wordpress サイトのログイン URL へのアクセスを示す検索セッションの例です。 Telnet クライアントはクエリ サーバーに接続し、文字列login
を入力します。
$ 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"
おそらく、その URL へのPOST
アクセスのみを検索したいとします。
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"
より洗練されたクライアント プログラムが計画されています。
ブラウザベースのインターフェイスは、 Telnetセクションで説明したものと同じ bleve スタイルのクエリも受け入れます。デフォルトでは、ブラウザ インターフェイスは http://localhost:8080 で利用できます。セッションの例を以下に示します。
基本的な統計と診断が利用可能です。この情報を取得するには、 http://localhost:9951/debug/vars
にアクセスしてください。ホストとポートは、 -diag
コマンドライン オプションを使用して変更できます。
このアーキテクチャでは、次の 3 つの簡単な手順で、標準の syslog を超える新しいパーサーの簡単な実装がサポートされるようになりました。
input/parser.go
で、supportedFormats() を展開して、追加の標準とnameをキャプチャします。parser/
で、適切な正規表現ステートメントを使用して新しい入力形式パーサーを作成します。timestamp
フィールド (例: 2006-01-02T15:04:05Z07:00
が含まれていることを確認してください。input/parser.go
に戻り、 NewParser() を更新して、新しい入力形式パーサーを適切にインスタンス化します。 プロジェクトは積極的に維持されていませんが、将来開発が再び行われる可能性があります。