compilation-mode: 便利な非インタラクティブシェルバッファ
kubernetesに限らないですがマイクロサービスアーキテクチャの開発をしているとサービスが大量に存在するためログを見るときにターミナルであれやこれやとコマンドを打たなければならず大変な苦行ですし、ターミナルがどんどん増えていってしまい容易にカオス化します。
そこで、emacsのcompilation-modeを利用して、たくさんのログ閲覧バッファを簡単に開いていくための関数を作りました。
(defun kube-log (namespace service)
(interactive "sNamespace: \nsService: ")
(let ((buffer (format "*kube-log<%s@%s>*" service namespace)))
(let ((buf-o (get-buffer buffer)))
(if buf-o
(progn
(switch-to-buffer-other-window buf-o)
(if (not (get-buffer-process buf-o)) (recompile))
(end-of-buffer))
(let ((compilation-buffer (compile (format "kubectl -n %s logs -lapp=%s -c %s -f" namespace service service))))
(switch-to-buffer-other-window compilation-buffer)
(rename-buffer buffer)
(end-of-buffer))))))
やっていることは素のcompileコマンドとほとんど変わりません。違いはパラメータに応じてバッファ名を設定し、複数実行を容易にしているところです。
M-x kube-log
でnamespaceとserviceを訪ねてきますので、入力するとログを開いてくれます。この関数の便利なところは、compilation-modeの機能を活用できることです。例えば、g
キーでコマンドを再実行できますし、C-u g
とやるとコマンドパラメータの修正実行ができます。ログを出してみたところ大量に出力されて見づらい場合は|grep
のようにフィルタを追加してやるのも便利です。
このスクリプトをベースとして様々な用途に応用ができます。
例えばangularのng serve
のような開発サーバーコマンドをemacs内で実行するなどの用途にも便利ですし、何度も再実行するようなジェネレータ系のコマンドを実行するためにも使い勝手が良いです。当然Unit Test関連のコマンドをこれで常駐させても良いです。
ターミナルをたくさん消費してコマンドを常駐させたり度々実行して結果表示しなければならないような用途に幅広く応用できると思います。
以上、小ネタでした。