最近ちょっと大きめのサービスをリニューアルしたんですが、リリース当初はエラーログとか張り付いて監視してました。 数台分散しているサーバに逐一ログインしてログファイルをtail -fしたりするのがもう面倒で、それを解決するためにツールを作りました。
各インスタンスからのログを集約してリアルタイムにブラウザで閲覧する
初めの着想はDockerコンテナの話でした。Docker内に吐かれるログを見るのに、インスタンスにログインして、docker execしてtailするとか、 ログファイルをホストにマウントして、それをtailするとかあると思いますが、そもそも分散している台数分確認するのが面倒で。 かつ各コンテナはネットワーク的に閉じているので、コンテナ側から送信して、それを集約して確認するツールにしました。こちらです:
releaseにビルド済みのバイナリを置いてます。
簡単に言うと、tail -fで読み取ったバッファを他に転送するだけのツールです。 もちろん、普通にtailコマンドのようなこともできますが、あんまり使いドコロはないかと…(そもそもtailコマンドがあるし) なので、もっとシンプルなfluentd的な感じというのがいいのかな。ただし、代わりに集約サーバとGUIがついています。
CentralサーバとGUI
このツールにはCentralサーバ機能がついていて、各ホストからのログ転送を集約して、GUIで表示することが可能です。 なので、分散しているサーバはネットワーク的に閉じていても、このCentralサーバにHTTPアクセスが可能なら、これらのログを閲覧することが可能です。
Instance -> Central はHTTP、Centarl -> GUIはWebSocketでリアルタイム転送します。よって、GUIからは流れてくるログが即座に反映されます。 また、GUIはツリー、2分割、4分割で表示可能なので、複数のログも同時に確認しやすいかなーと。
画面は4分割表示Centralサーバへの転送は単純なHTTP POSTなので、このツールでなくても、curlとか他のHTTPクライアントで転送可能です。 CORSも実装してあるので、XHRでも可能といえば可能です。
詳しい使い方が説明しにくいですが、コマンドとかはGithubを参照頂ければ。 Golangで実装した1バイナリファイルだけなので、導入も簡単です。
注意点とか
- 開発用途なので、HTTPのみのサポートです。HTTPSじゃないので、心配な方は使わないほうがいいかも。
- 転送されたデータは揮発性であり、どこかに保存したりしません。
まぁ基本的にfluentdの方が機能多いので、永続的なものはそっちが良いと思います。 開発中に流れるログデータとかをリアルタイムに見られるツール、という位置付けですね。
その他
Golangでのプロセスのdaemon化にsevlyar/go-daemonを使ったけど、扱いが難しかった…。 1バイナリでのdaemon化がsupervisorとか使わずにもっと簡単にできるといいなーって思いました。
現場からは以上です。