まだ今ほどコロナウィルスの影響がなかった新春の折。 簡単にタスク分割して並列実行できそうなバッチ処理を、 CloudRun を使ってHTTP APIを用意し、そこに投げまくることでさくさく実行する—という構成を試しました。
で、ログに色々情報を出しているので、そこから例えば XXX が何件あるか、みたいな集計などをやりたかった訳です。 CloudRun では標準出力にログを出しておけば Stackdriver Logging に保存されるのでどうとでもなるだろう、 という甘い目論見だった訳ですが、 そう上手くはいかず、ちょっと焦ったのでそのメモです。
結論から言うとコマンドラインから検索条件を指定して出力できます。
gcloud logging read
基本的に、ログを長期保存するにはシンクを設定しておく必要がある
まず、ウェブコンソールからエクスポートするべくログビューアに行って期間やら適当な文言やらで 検索条件を指定すると、それにマッチしたものがブラウザ上で簡単に確認できます。 便利! じゃあということで今この検索した条件にマッチするものをすべてエクスポートしたいんだけど、 と画面を見渡してみて、燦然と輝く「ログをダウンロード」というのをクリックしてみる訳です。1
そうすると出ました。 以下のようなダイアログが。

え?
読み込まれたログを直近のものから順に 100 件ダウンロードする
現在ログビューアに読み込まれているログが最大 300 件ダウンロードされます。さらに多くのログをダウンロードする必要がある場合は、ログをエクスポートしてください。
300件まで?
マジかよ〜ログは1000万行以上あるんだよ〜え、どうしよう、シンクを設定してもう一回バッチ処理実行しなきゃいけないのかな… と最悪の事態が頭をかすめる中、 必死で検索キーワードを Google に打ちこみます。 日本語の情報がなかなか出てこないので英語のキーワードも入れてみたところようやく以下の記事が見つかりました。
How to export previous logs in Stackdriver
「gcloud logging read
でできる」だって!
gcloud logging read
たとえば以下のようなコマンドでログを取得できます。2
gcloud \
--project ${PROJECT_ID} \
--format text \
logging read 'resource.type="cloud_run_revision" resource.labels.service_name="xxx" timestamp>="2020-02-26T00:00:00.000Z" "SearchKeyword"'
これで事なきを得てほっとひと安心、 家に帰ってビールをあおりつつブログにしたためようと筆を取った次第です。
どうも GCP を使っていると「それコマンドラインでしかできないよ」みたいなこと出てきますね。
まとめ
ということで今回は Stackdriver Logging からシンクを設定していないログを出力する方法を試しました。 ただし、この方法では直近30日間のログまでしか得られません。 基本的にはシンクを設定しておき、条件にマッチするものを Cloud Storage や Pub/Sub、BigQuery へエクスポートしましょう。
参考:ログのエクスポートの概要