Cloud Logging は GCP 内のリソース等で生成されるログを処理するためのサービスです。旧称は Google Stackdriver Logs です。Cloud Logging 自体は、Operations Suite という枠組みの一部という位置付けです。基本的な使い方を記載します。
書き込み (textPayload
や jsonPayload
がサポートされています)
gcloud logging write my-test-log 'A simple entry.'
gcloud logging write --payload-type=json my-test-log '{ "message": "My second entry", "weather": "partly cloudy"}'
読み出し
gcloud logging read 'resource.type=global'
gcloud logging read 'resource.type=global' --freshness 10d --limit 2
削除
gcloud logging logs delete my-test-log
API の利用 entries.list (Chrome ブラウザから直接 EXECUTE することもできます)
curl -sS -XPOST -H 'Content-Type: applicaiton/json' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://logging.googleapis.com/v2/entries:list \
-d @req.json
req.json
{
"resourceNames": [
"projects/my-project-xxxx"
],
"filter": "resource.type=global",
"orderBy": "timestamp desc"
}
上記 API は、例えばこちらのページで利用した Terraform モジュールが利用するライブラリでも利用されています。
res = self.api.entries().write(body=body).execute()
...
return {
'timestamp': {'seconds': int(time.time())},
'insertId': record['etag'],
'jsonPayload': {
'requestMetadata': {'callerIp': record.get('ipAddress')},
'authenticationInfo': {
'callerType': record['actor'].get('callerType'),
'principalEmail': record['actor'].get('email')
},
'methodName': record['events'][0]['name'],
'parameters': record['events'][0].get('parameters'),
'report_timestamp': self.get_time_dict(record)
},
'resource': {'type': 'global'}
}
query = {
'orderBy': 'timestamp desc',
'pageSize': 1,
'resourceNames': [self.project_id],
'filter': 'logName={}'.format(destination)
}
log = self.api.entries().list(body=query).execute()
Cloud Logging は書き込まれたログをルーティングして、既定では以下の二つの ログバケット
のいずれかに格納します。
_Required
→ 400日の保持期間を持ちます。GCP のリソース作成時のログなどが書き込まれます。_Default
→ 30日の保持期間を持ちます。API で書き込んだログはこちらに格納されます。料金を支払えば保持期間を延長設定できます。既定の二つの Log Sink に加えて、Pub/Sub や Cloud Storage、BigQuery にログを格納するための Log Sink を独自に作成することもできます。
ログは tail -f
コマンドのように、ストリーミング確認できます。
「ストレージによるスコープ」を選ぶことで Log Sink を選択できます。「範囲を絞り込む」をクリックします。
上記 _Required
や _Default
以外の Log Sink を利用している場合には、明示的に選択しないと表示されないことがあるため注意します。
Log Sink は「filter と destination」を設定値として持ちます。Destination には、別のプロジェクトの Log Bucket や Pub/Sub Topic を指定できます。
以下の例では、こちらのページの設定で Cloud Identity から組織のログとして取り込んだログを、Log Sink で別の場所に流し込みます。
参考ページ: Storing your organization's logs in a log bucket
Destination として Log Bucket を作成してみます。
gcloud logging buckets create my-log-bucket --location=global --project=myproject-20210411
_Default
と _Required
以外に一つ追加されたことが確認できます。
gcloud logging buckets list --project=myproject-20210411
LOCATION BUCKET_ID RETENTION_DAYS LIFECYCLE_STATE LOCKED CREATE_TIME UPDATE_TIME
global _Default 30 ACTIVE
global _Required 400 ACTIVE True
global my-log-bucket 30 ACTIVE 2021-08-02T13:34:03.406038292Z 2021-08-02T13:34:03.406038292Z
組織ID を確認しておきます。
gcloud organizations list
組織のログを対象とするためには --organization
オプションを指定します。
連携される Cloud Identity ログのうち、パスワード変更のログをフィルタしてみます。
組織のログのみを対象とし、組織配下のプロジェクトのログを対象としたくないため、--include-children
オプションは指定しません。
gcloud logging sinks create my-log-sink \
logging.googleapis.com/projects/myproject-20210411/locations/global/buckets/my-log-bucket \
--log-filter='protoPayload.metadata.event.eventName="password_edit"' \
--organization=111111111111
作成されたフィルタを確認します。
gcloud logging sinks list --organization=111111111111
gcloud logging sinks describe my-log-sink --organization=111111111111
サービスアカウントの情報をメモしておきます。
writerIdentity: serviceAccount:o111111111111-523844@gcp-sa-logging.iam.gserviceaccount.com
ログバケットが存在する myproject-20210411
プロジェクトにおいて、サービスアカウント o111111111111-523844@gcp-sa-logging.iam.gserviceaccount.com
に対して、「Logs Buckets Writer」ロールを付与します。
確かにログが連携されることを、プロジェクト myproject-20210411
の Cloud Logging で確認します。
上記の gcloud コマンドによる操作は Cloud Console から行なうこともできます。
gcloud と同様に、destination については Pub/Sub なども指定できます。