tail -F /path/to/access.log のようなストリームに対して何度でもgrepを試行錯誤できるツール filt を作った

filtというツールを作りました

github.com

これはなに

まずは以下のスクリーンキャストをご覧ください

f:id:k1LoW:20190730230540g:plain

tail -F /path/to/access.log のようなログの流れを止めてはgrepをして、止めてはgrepのコマンドを変更してしています。

その間、実は裏では実際のストリームは止めていません。

つまり、ストリームのパイプ先に まずfiltを指定しておく ことで、ストリーム自体は止めずに、パイプ先のコマンドを 後で何度でも 変更できます。

grepsedawkが下手なので何度も試行したい

私はgrepsedawkなどのコマンドを一発で指定できるほど練度が高くないので、コマンドを組み立てるために何度も Ctrl+C でキャンセルしては再実行の繰り返しをしていました。

最近は sternHarvest などでKubernetesのPodのログを流すことをもあるのですが、ログが流れ出すまでちょっと時間がかかります。それに対して毎回キャンセルして再度コマンド組み直しというのは結構ストレスです。

filt を使ってこの試行錯誤の敷居を下げることで、手早くコマンドを組み立てられるし、カジュアルにコマンドを組み立て直すこともできます。

そして、「まずはログを流しておく」「いろいろフィルタしてログをみる」というログを見る良い習慣にもつながると考えました。

使い方

MacでのインストールはHomebrewが利用可能です。

$ brew install k1LoW/tap/filt

filt コマンドが使えるようになったら、あとは、tail -F などのストリームにパイプでつなげるだけです。

$ tail -F /var/log/nginx/access.log | filt

上記のように直接パイプで filt を指定するのがオススメです。

流れているログに対して「grepでフィルタリングしたいな」と思ったら EnterCtrl+C を押します。すると、ログの流れが止まりプロンプトが出て入力待ち状態にになります。

そのプロンプトに grep -v GET などのコマンドを入れて Enter を押すと、今度は tail -F /var/log/nginx/access.log | grep -v GET でフィルタリングされたログをが流れます。

もう一度フィルタするコマンド入れ替えたいときは、またEnterCtrl+C を押すことでログの流れが止まりプロンプトが出てきます。

これの繰り返しです。

tail -F なストリーム自体を終了したいときはプロンプトが出ているときに exit と入力して Enter を押すか、 Ctrl+C を押してください。

filtを作ってから

私が「まずはログを流しておく」ようになりました。

Ctrl+C を押したらまた最初からログが流れてくるのを待たないといけないのか」というような心理的な障壁もないので、カジュアルにコマンドを組み立てなおして、「今欲しい情報だけが流す」ようになりました(それまでは目で一生懸命眺めることがあった)。

以前作ったevryなども指定できます。

k1low.hatenablog.com

結構、開発体験が変わるのでおすすめです。是非使ってみてください。