構造化ログとは
下記のように JSON 等のデータ形式で出力されたログのこと。
GCP では JSON 形式のログは自動的にパースされ、検索クエリで利用できるようになり便利。
(Cloud Run では確認済み)
改行も JSON としてエスケープされるので、副次的に複数行のログも扱いやすくなる。
{"level": "INFO", "message": "hello\nworld", "timestamp": "2020-07-01 00:00:00"}
Python でログを JSON で出力するサンプル
Pythonでは logger に独自のフォーマッターを設定することでログを JSON 形式で出力することができる。
$ python -V
Python 3.8.0
logger.py
import sys
import logging
import json
import traceback
class JsonFormatter(logging.Formatter):
def format(self, log):
return json.dumps({
"level": log.levelname,
"message": log.getMessage(),
"timestamp": self.formatTime(log, self.datefmt),
"traceback": traceback.format_exc() if log.exc_info else []
})
formatter = JsonFormatter(datefmt="%Y-%m-%d %H:%M:%S")
stream = logging.StreamHandler(stream=sys.stdout)
stream.setFormatter(formatter)
logger = logging.getLogger('your-logger-name')
logger.setLevel(logging.INFO)
logger.addHandler(stream)
設定した logger を読み込んで利用する。
sample.py
from logger import logger
logger.info("hello\nworld")
logger.info({"foo": "foo", "boo": "boo"})
下記のような JSON 化されたログが出力される。
{"level": "INFO", "message": "hello\nworld", "timestamp": "2020-07-01 00:00:00", "traceback": []}
{"level": "INFO", "message": {"foo": "foo", "boo": "boo"}, "timestamp": "2020-07-01 00:00:00", "traceback": []}
Cloud Logging
ロギング -> ログエクスプローラ画面から検索することができる。
ログとして出力したデータは jsonPayload
に格納されており、クエリ上で検索することができる。
resource.type="cloud_run_revision"
jsonPayload.level="INFO"
jsonPayload.message.foo="foo"
下記のようにログが検索結果としてでてくる
{
"insertId": "xxxxxxxxxxxxxxxxxxxxxxxx",
"jsonPayload": {
"message": {"foo": "foo", "boo": "boo"},
"traceback": [],
"timestamp": "2020-07-07 15:33:28",
"level": "INFO"
},
...
}