2018-11-11

手っ取り早く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

  1. gcloud コマンド入れる
  2. gcloud auth login
    • ブラウザでログイン
  3. 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

| jq '.[].jsonPayload'

みたいな感じ。

実は jq の出力はそのままだと正しい JSON にならない。もうちょっと頑張って正しく JSON にしたい場合は jq -cとawkでndjsonを本来のJSONにする - あーありがち(2018-11-13) をどうぞ。

感想

なんでも揃ってるクラウドインフラの中に G Suite があるのマジで強い。でも Advanced Service オメーはダメだ。リファレンスをください。API とのマッピングどうなってるのかわっかんないよ。

  1. 実は自分が久しぶりに GAS を書いたら console.log() を使っているのに Script Editor のログが表示されずに悩んだ。 

  2. 自動化する場合は versioned archive を使うといいんだけど、今回の話題と違うので割愛。 

  3. 個人だとこんなもんで十分だけど、業務の場合は IAM Role の設定で悩んでください。 

  4. JSON は手で書くのはつらいが、読む分にはそうでもない気がする。YAML は逆に小さいうちはとても書きやすいがでかくなると目で追うのがつらくなってくる。 

  5. App Engine の log は可能 

About

例によって個人のなんちゃらです