前回、Google Functions: console.infoやconsole.errorなどとログビューアの「重大度」の関係性という記事を投稿しました。そこではconsole.errorやconsole.infoなどのConsole APIでは、GCP上のログの重要度(severity)は、DEFAULTかERRORの二択になるということを説明しました。
GCP上の重要度はこの2つしか無いわけではなく、以下の9つのレベルがあります。
 
この投稿では、Google Cloudのロギングクライアントライブラリを使って、Cloud Functionsでも重要度を指定したロギングをする方法を説明します。
この投稿で学ぶこと
- Google Cloud Function & Node.jsで@google-cloud/loggingを使って重要度をつけたログを記録する方法
- そして、その面倒くささ。
- 
console.logと@google-cloud/loggingで記録されるログ内容の違い。
ロギングクライアントライブラリをインストールする
まず必要となるロギングクライアントライブラリをインストールします。
yarn add @google-cloud/logging
ライブラリをCloud Functionsに組み込む
次にこのロギングライブラリをCloud Functionsの実装に組み込みます。
下のコードが組み込んだものです。console.logを使ってロギングするのと打って変わって、いろいろな下準備が必要なのと、ログを記録するごとにログエントリーオブジェクトを作る必要があるのが分かります。ちょっとめんどくさそうですね。
const { Logging } = require('@google-cloud/logging')
exports.loggingWithClient = async (req, res) => {
  // クライアントを作る
  const logging = new Logging()
  // ログ出力先を決めてロガーを作る
  const log = logging.log('my-name')
  // ログエントリーを作る
  const entry = log.entry(
    {
      resource: { type: 'global' },
      severity: 'INFO', // 重要度「INFO」を指定
    },
    'ログをクライアントで書き込むテスト',
  )
  // ログを書き込む
  await log.write(entry)
  res.send('OK')
}
ひとまずこれをデプロイして、
gcloud functions deploy loggingWithClient --runtime=nodejs12 --trigger-http
呼び出してみます:
curl https://asia-northeast1-${PROJECT}.cloudfunctions.net/loggingWithClient
どのようにログが記録されたか、ログビューアを開いてみます。console.logで記録したログは、自動的にどの関数のものか関連付けされるため、管理コンソールの「Cloud Functions」から当該関数の「ログを表示」から行く導線が使えましたが、上のコードで記録したログは関数に紐づけてロギングしていないので、「ロギング」の「ログビューア」から探しに行きます:
この導線からだと、プロジェクトの全ログが出るので、たくさんログがある場合は「直近の3分」などで絞り込むと見つけやすいです。
このように、console.infoなどではできなかった重要度「INFO」でロギングされているのが確認できます:
 
今回試したサンプルコードでは、ログエントリーのメタデータを色々省いたため、かなり質素な内容になっています:
下は普通にconsole.logしただけのログエントリーですが、それと比べると情報の少なさが分かります:
まとめ
この投稿を通じて、次のことが分かったと思います。
- Google Cloud Function & Node.jsで@google-cloud/loggingを使って重要度をつけたログを記録する方法
- そして、その面倒くささ。
- 
console.logと@google-cloud/loggingで記録されるログ内容の違い。
@google-cloud/loggingはかなり低レベルなロギングができる一方、使い勝手が良くなく、どの関数で実行されたかなどは自動的に記録されないので、次回はもっと利便性の高い方法について投稿したいと思います。




