費用ゼロ円でリアルタイムなログ監視(ログのプッシュ通知)をしていく
こんちわ、うずらです。
現在デプロイをしたいんだけど、できない、というつらい状態で待ち時間が発生しております。
世界の中心で愛をさけんでいますが、(検閲削除)なので、なにもできないストレスを発散しているともいいます。
本題、ログ監視
さて、みなさんログ監視していますか?特にFatalなログ監視というものは非常に重要ですね。
ログはデバッグログしかない、クレームがきてから対応すればいい、Uncaughtな例外を見ない、運用開始したら/dev/null
おくりにする、E_ALL
あるいは-1
ではない、といった方々におかれましては、ピンとこないかもしれません。
しかし、Fatalなログを監視することで、なにか発生した問題に先立って対応できるので(対応しないとしても、知っていて無視するのと、しらずに来るのは違います)、大変便利です。攻めの監視です。
そういったことが「いみわかんない」という方々には、残念ながら本エントリは多分やくだたないと思います。(あるいは一切エラーなんて発生しないエンジニアにも不要かなと思います)
リアルタイムログ監視とは?
正しい意味はわかりませんが、ここでは /var/log/critical.log
になにかが吐き出されたら、即座に通知してくれるもの、を指します。
「一般的には」、そういったものはfluentd
やpapertrail
などでログ集約をおこない、ログサーバーに送信し、何らかでFatal、Criticalか判定し、プラグインなどでSlackに通知、等とするのかなと思います。かっこいいですね!
所で、現場によってはそういうものに工数やお金がでないことも非常によくあります(個人の主観です)。
しかし、パラノイアなエンジニアは、特にリリース直後はログファイルをtail -f
して眺め続ける、などの行為をします。一般的には理解され難いのですが、サガというやつでしょう。
ログを眺める行為はツイッターなみに中毒性があるので(主観)他の仕事がおろそかになってよくありません。逆に他の仕事していると気づけませんね、さらにいえば最近の不安定なインターネットだとsshが切れて止まってるなんてこともあります。
もっとログの方から、直接的に教えてほしいですよね。エラーよ、オレに訴えかけてきてくれ。
boson + LINE notify
というところで、以下のようなことをぼやいたら「作れ」というレスがきました。そうですね、わかる。
goとかでできててシングルバイナリで、あるログファイルをtailして、更新があったらwebhookたたくだけでいいので軽いツールでいいやつないかなと思っている。(数日使いたいだけなので、fluentdみたいなのを組みたくはない)
— uzulla (@uzulla) 2020年7月31日
しかし作るのは面倒(だいぶ自分勝手)
すると、突如技術的筋力で有名な id:moznion がつくってくれました!!!すごい!!!今度なんかおごります!!!
使い方
基本的にbosonはSTDINがきたら、ログの行を置換してボディをつくってくれるので、それをWebhookに投げる、というものです。
たぶんSlackでもなんでもいいのですが、Slackになげてもどうせ僕しかみませんので、自分のLINEに飛ぶようにしたいと思います。
LINE notify については公式Docsを見ていただくとして、とにかくAPI tokenを取得します。
BosonをDLします、 リリースページから自分にあったバイナリをDLしましょう、Goは楽でいいな。
あとはサーバーでscreenなどを立ち上げ*1
そこの中でこうじゃ!
$ tail -n 1 -F /var/log/critical.log | ~/boson --url "https://notify-api.line.me/api/notify" --header "Content-Type: application/x-www-form-urlencoded" --header "Authorization: Bearer {API token}" --body "message=OMG: {{ line }}" --url-encode-body-replacement
-n 1は重要で、これしておかないと本当に飛ぶ設定になっているか怪しいものがありますね。
-F も重要ですね、ログならローテーションあるでしょう。
あとはデタッチ等します!
あとはご飯でも食べに行きましょう。アラートがあれば即座にLINEに通知が飛んできます!やった!
これで誰より早くUnhandled Errorを検知することができ、サービスの品質が向上しますね!!(自己満足)
このためにも
ログは常時選別し、「必要なものだけ出す」「無意味な(ノイズな)ログは消す」ということを心がけましょう。
ところで私はログレベルという昔からの慣習を全く信用しておらず、目的別にログファイル自体をわけています。
なので、通知は本当にやべえときしか連続できたりしません。
なお、Bosonにはgrep機能がありますので、色々やれば大丈夫です、僕は使わないですが。
tail からパイプでコマンドをつなぐ事もできますが(たとえばgrep -v
したいこともあるでしょう)、バッファリングに注意してください(ここでは解説しません、むずかしいので)そこでミスると、いつまでも送信されないなんてことがあります。
履歴はけしていい
たまに、Notifyの会話のハンバーガーメニューから、その他>履歴削除 しておくと気分がはれやかです。
「boson自体の監視はどうするか」
そんなこと考えるなら、しっかりした基盤を組みましょう。
できないこと
レンサバではうごかんね(動くかもしれんけど)
やってはいけないこと
長期的にこれを運用するのはおかしいでしょう。そうなったらちゃんと金と工数をゲットしましょう。
これはパラノイア気味のエンジニアが「自主的におこなう」という事であり、正常な体制としてみれば「まったく正しくない」方法です。まともにしたいなら、前述の通りログコレクタをしっかりと作り込んでログ監視をしましょう。そこにお金ももらうべきですし、通知が飛ぶ時間帯を指定したりするべきでしょう。
もしあなたがマネージャーであれば、これをエンジニアに強制するのは人権侵害に等しい行為です、やめろ。あるいは自分のLINEを登録して、連絡は営業時間にしろ。
まとめ
自分みたいなパラノイアなエンジニアであれば、きっと安定稼働までは自主的にログをみてしまう(工数がでなくても!お金がでなくても!)と思いますし、その時にtailにはりつくのは非生産的です。こういったツールを活用し、もっと他の生産的活動をしましょう!!
現場からは以上です。
*1:あるいはtmuxやnohupでもいいですが