Cloud Loggingのクエリ言語をまとめていく

2 min read読了の目安(約2600字

はじめに

Cloud Loggingを使用しているのですが、クエリの書き方が分からず苦戦したので公式ドキュメントを読みながら確認した内容を書いています。

ローカル環境からログを送信

こちらの公式ドキュメントに載っていいます。
今回は、nodeのwinstonを使ってアップロードしてみました。

https://cloud.google.com/logging/docs/setup/nodejs?hl=ja
index.ts
// Imports the Google Cloud client library for Winston
import { LoggingWinston } from '@google-cloud/logging-winston';
import winston from 'winston';

// Creates a client
const loggingWinston = new LoggingWinston({
  projectId: 'your-project-id',
  keyFilename: '/path/to/key.json',
});

// Create a Winston logger that streams to Stackdriver Logging
// Logs will be written to: "projects/YOUR_PROJECT_ID/logs/winston_log"
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.Console(),
    // Add Stackdriver Logging
    loggingWinston,
  ],
});

logger.info('info message', {
  name: '鈴木たろう',
  age: '34',
  like: ['ラーメン', '将棋', '睡眠'],
  attribute: { phone: '000', birth: '2000' },
});

実行するとこのような形でログが送信されます。
クエリの動作確認した際はこれでデータが作れると思います。

Logging のクエリ言語

こちらも公式ドキュメントが詳しく書いてあります。

https://cloud.google.com/logging/docs/view/logging-query-language?hl=ja

ブール演算子

AND, OR, NOT が使用できます。(演算子は常に大文字の必要があり)

例えばこのような感じになります。

(jsonPayload.metadata.name = "鈴木たろう" AND jsonPayload.metadata.age =34) 
OR jsonPayload.metadata.age =21 
NOT jsonPayload.metadata.name = "鈴木三郎"

比較の演算子ANDは省略でき、また、NOT-で書くことができます。

下記のクエリは上記とものと同じです。

(jsonPayload.metadata.name = "鈴木たろう" jsonPayload.metadata.age =34)
OR jsonPayload.metadata.age =21 
-jsonPayload.metadata.name = "鈴木三郎"

また、値をまとめることもできます。
jsonPayload.metadata.name = ("鈴木たろう" OR "鈴木次郎") は分配されて下記と同じ意味です。
jsonPayload.metadata.name = "鈴木たろう" OR jsonPayload.metadata.name = "鈴木次郎"

比較演算子

=, !=, >, <, >=, <=, :, =~, !~ がです。
一部、特殊なものがありますが、一般的な演算子です。

: ば部分一致の演算子です。
jsonPayload.metadata.name : "鈴木"鈴木という文字列が含まれるものが抽出できます。

=~!~は正規表現を表す演算子です。
jsonPayload.metadata.name =~ "^鈴木$" のように使用することができ、正規表現に一致するものを抽出できます。
!~は反対に一致しないものを抽出できます。

オブジェクトと配列の型

既に例示で上げているようにオブジェクトは.でアクセスできます。

また、配列の場合は配列内に1つでも一致する場合、抽出されます。

例えばこういうログがある場合

{
  name: '鈴木たろう',
  age: '34',
  like: ['ラーメン', '将棋', '睡眠'],
  attribute: { phone: '000', birth: '2000' },
}

jsonPayload.like = "ラーメン" のクエリをすると抽出されます。

おわりに

これ以外にも便利な関数とかあるので公式ドキュメントを確認していただければです。

ログエクスプローラは結構優秀なので、ぽちぽちクリックするだけでもログを絞り込むことはできます。
ただ、構造化された値の中身で検索したい場合はクエリを書く必要があるので、クエリ言語とデータ構造を把握していく必要があります。
今回は超最低限のことしか書いていないので、ちょっとずつ追記していこうと思います。