手っ取り早くgcloudコマンドでGoogle Apps Scriptの出力を扱う準備
Logger APIはツラカッタ
Google Apps Script には Script Editor もあるし、デバッガもついているし、G Suite が使えれば無料で使えるし、Time-based Triggerもついてるし、かなりできるやつではあるんだが、真面目に使おうと思うといろいろやっかいな問題を抱えていた。
その一つがログ、特にちょっとでも大きめな、例えば1画面に収まらないデータを扱おうと思うと途端に面倒くさくなってしまう。
自分が気になっていた Logger API の問題は以下のようなものだ。
- Object を食わせると謎の独自 Stringify を行う
- 一つのログが大きすぎると勝手に端折ってしまう
結構しんどい。
時代はStackdriver Logging
で、かつては Spreadsheet に吐くとかいろいろ工夫がなされていたわけだが、今はありがたいことに標準で Stackdriver Logging に対応している。
Stackdriver Logging for Google Apps Script is now available | Google Cloud Blog
日本語の公式発表が見つからないので英語の方のリンクを貼っておく。
使い方
特に事前準備は必要なくて、コード上の記法が増えただけと言ってよい。
- これまでもあった Logger.log() はそのまま Script Editor 上のログに
- console.log() は Stackdriver Logging のログに
それぞれ送られる。普段 Google Apps Script は書いていないが JavaScript を書いているという人が何気なく使うと Stackdriver Logging の方へ送られるという寸法だ。1
料金の話
基本的には無料で使える。
というのも、GCP プロジェクトとして課金アカウントに紐づけてなくても使える からだ。容量の話などを気にしている人もいたが、そもそも課金アカウントと紐付いていないと請求はされないわけで、業務でその辺の管理をしっかりやっていくぞという場合でもなければ気にする必要はないと思う。
でもWeb UIはダルい
本題はここから。
常に 20" 以上のモニタを広く使ってコード書いてる人にはあまり関係ないかもしれないが、13" クラスの画面と terminal が主戦場の人間にとっては全部 Web UI というのは暴力でしかないし、実際に取得できた JSON のデータを解釈してどう整形しようか考える段階では普通に手元のエディタで処理したいわけですよ。
そこで Stackdriver Logging のデータを gcloud logging read することにする。
gcloudコマンドの準備
Google Cloud SDK のインストール | Cloud SDK のドキュメント | Google Cloud
自分の mac にどうやって入れたかは忘れたけど、たぶん最新版を inteactive に入れたような気がする。2
- gcloud コマンド入れる
- gcloud auth login
- ブラウザでログイン
- OAuth2 の認可を明示
これで自分が owner になっているプロジェクトのログは自由に見れるので3、
実際にreadする
Command Line Interface | Stackdriver Logging | Google Cloud
にしたがって
gcloud logging read --project <projectId>
と打ってあげればログを terminal で閲覧できる。快適。
default formatは実はYAML ?
Stackdriver Logging に JavaScript Object を渡すといい具合に jsonPayload という形でログが残る。これは非常に便利な機能なんだけど、gcloud logging read で取得できるログはどうも標準では YAML 形式っぽい。
JSON のデータが取得できると思って目grep しているとスルーしてしまうので注意が必要。または
gcloud logging read --format json
すれば JSON でログを取得できるので、こっちの方が目の引っかかりはよいかも。4
tailできない問題
もう一つ、gcloud logging サブコマンドでは tail -f のようなことはできない5ので、そこら辺は –limit と組み合わせるなりする必要がある。
payloadだけクレ
jq使え。
| jq '.[].jsonPayload'
みたいな感じ。
実は jq の出力はそのままだと正しい JSON にならない。もうちょっと頑張って正しく JSON にしたい場合は jq -cとawkでndjsonを本来のJSONにする - あーありがち(2018-11-13) をどうぞ。
感想
なんでも揃ってるクラウドインフラの中に G Suite があるのマジで強い。でも Advanced Service オメーはダメだ。リファレンスをください。API とのマッピングどうなってるのかわっかんないよ。