サクッとログ収集できる「oklog」を試してみた

ログ管理でこんな悩みはないですか?

  • ログを手動でtailしてるけど、どっかに簡単に集約してログを見たい
  • ElasticSearchを使ってるけど、操作も難しいし機能が多くて使いこなせない
  • FluentdやLogstashみたいなものを使ってログを送ってるけど、パフォーマンスに問題を抱えている
  • 集約したログのgrepだけしたいのに、なんでこんなややこしいんだ!?

そんなときは「oklog」を使ってみてはいかがでしょうか?
みたいなことがoklogのREADMEに書いてあったので、実際に使ってみた!
https://github.com/oklog/oklog

oklog とは

oklog は、Go言語製のログ管理システムです。
インストールは、Go言語製ということもあり、1バイナリを置くだけで済むので楽ちんです。
oklogの持っている機能は以下になります。

  • ログの転送
  • ログの集約
  • ログクエリーの実行

詳しい使い方を見ていきましょう。

oklog の導入

oklogの導入をしていきます。
前提として、Ubuntu16.04で進めていきます。

oklog インストール

oklogはバイナリファイルで提供されています。
https://github.com/oklog/oklog/releases

ということで、サクッとインストールできます。

$ wget https://github.com/oklog/oklog/releases/download/v0.2.2/oklog-0.2.2-linux-amd64 -O /usr/local/bin/oklog
$ sudo chmod 755 /usr/local/bin/oklog

oklog の使用方法

ヘルプを見てみましょう。

$ oklog -h
USAGE
  oklog <mode> [flags]
MODES
  forward      Forwarding agent
  ingest       Ingester node
  store        Storage node
  ingeststore  Combination ingest+store node, for small installations
  query        Querying commandline tool
  stream       Streaming commandline tool
  testsvc      Test service, emits log lines at a fixed rate
VERSION
  0.2.2 (go1.8.3)
  • forward
    • ログの転送モード
  • ingest
    • forwarderからの書き込みを受信するモード
  • store
    • ingestで受け取ったデータをディスクに書き込むモード
  • ingeststore
    • ingestとstoreを合わせたモード
  • query
    • 取集したログに対してクエリーを実行するモード
  • stream
    • 上記queryをリアルタイムで受け取る

1つのコマンドで

  • Fluentd
  • ElasticSearch
  • Kibana

的なことができるようです。

試してみた

じゃあサクッと試してみましょう!

# ingeststoreモードでログを受け取れるようにしておく
$ oklog ingeststore -store.segment-replication-factor 1
ts=2017-09-14T12:39:04.875025109Z level=info cluster_bind=0.0.0.0:7659
ts=2017-09-14T12:39:04.887173939Z level=info fast=tcp://0.0.0.0:7651
ts=2017-09-14T12:39:04.887289145Z level=info durable=tcp://0.0.0.0:7652
ts=2017-09-14T12:39:04.8873812Z level=info bulk=tcp://0.0.0.0:7653
ts=2017-09-14T12:39:04.887478776Z level=info API=tcp://0.0.0.0:7650
ts=2017-09-14T12:39:04.890380114Z level=info ingest_path=data/ingest
ts=2017-09-14T12:39:04.891325655Z level=info store_path=data/store

# テスト用に適当にログを吐く
$ touch /tmp/test.log

# forwardモードでログを転送する
$ tail -f /tmp/test.log | oklog forward localhost

# ログを流してみる
$ echo -e "number:1\tname:田中" >> /tmp/test.log
$ echo -e "number:2\tname:鈴木" >> /tmp/test.log
$ echo -e "number:3\tname:佐藤" >> /tmp/test.log

# クエリーを流してみる
$ oklog query -from 5m -q "田中"
number:1        name:田中

ご覧のとおり、かなり楽に収集してクエリーでログをフィルタリングできました!
複数台の場合も試してみます。

# 別々のサーバーでingeststore起動
# host1, host2はそれぞれのサーバーのPrivate IP
host1$ oklog ingeststore -cluster host1 -peer host1 -peer host2
host2$ oklog ingeststore -cluster host2 -peer host1 -peer host2

# テスト用に適当にログを吐く
host3$ touch /tmp/test.log
host4$ touch /tmp/test.log

# forwardモードでログを転送する
host3$ tail -f /tmp/test.log | oklog forward host1
host4$ tail -f /tmp/test.log | oklog forward host1

# ログを流してみる
host3$ echo -e "number:1\tname:ホンダ" >> /tmp/test.log
host4$ echo -e "number:2\tname:スズキ" >> /tmp/test.log
host3$ echo -e "number:3\tname:カワサキ" >> /tmp/test.log

# クエリーを流してみる
host3$ oklog query -from 5m -q "スズキ" -store host1 host2
number:2        name:スズキ
host3$ oklog query -from 5m -q "ホンダ" -store host1 host2
number:1        name:ホンダ

# クラスターなのでforwardしてないingeststoreサーバーにもデータが存在する
host3$ oklog query -from 5m -q "スズキ" -store host2
number:2        name:スズキ

この通り、サクッと複数台の集約&クラスタ構成ができました!

最後に

かなりお手軽にログ集約とその検索ができるので
FluentdやElasticSearchをわざわざ用意するほどでもない…というケースではかなり有用ではないでしょうか。

ログの取得がコマンドで簡単に行えるため、ログ監視もしやすそうです。
またコマンドラインだけでなく、UI機能も提供されてます。

ログの可視化というよりは、queryをブラウザで実行できる くらいの機能です。
画面はこんな感じ。

負荷試験など一時的にログ収集したいってケースが多々あるので、
今後使っていきたいなぁと思いました。

では!