💬
Batch for Google Cloudのログのseverityについて調べてみた
Batch for Google Cloud(以降Batch)において、Pythonのloggerを使ってログをだしていたのですが、log levelをDEBUGにしていても、Cloud Logging上のseverityがERRORででてしまっていました。
これはpythonのloggerはデフォルトでは標準エラー出力にログを出すためだと思われます。
下記を参考にseverityがどうやったら変わるかをちょっと観察してみました。
code
import logging
import json
import sys
import google.cloud.logging
logging.basicConfig(format="[%(asctime)s][%(levelname)s] %(message)s", level=logging.DEBUG)
logger = logging.getLogger(__name__)
logging_client = google.cloud.logging.Client()
logging_client.setup_logging()
logger.setLevel(logging.DEBUG)
logger.debug("logger log for sample_logging")
print("print log for sample_logging")
print("print log stderr for sample_logging", file=sys.stderr)
inf_entry = dict(
severity="info",
message="structured info log for sample_logging",
)
print(json.dumps(inf_entry))
error_entry = dict(
severity="error",
message="structured error log for sample_logging",
)
print(json.dumps(error_entry))
これをmain.pyとして、Dockerイメージを作りBatch上で動かしてみました
Result
logger.debug
log levelがdebugでもseverityはERRORになりました。
これは標準エラー出力に出す場合、severityはすべてERRORになるためだと思われます。
print + unstructured log
printだとseverityはINFOでした
print + unstructured log + stderr
printで標準エラー出力を指定してだすと、severityはERRORでした
print + structured log
structured logでseverityを指定すれば、その通りにseverityが指定されています。
loggerの設定でstreamをstdoutにした場合も見てみます。
code
import logging
import json
import sys
import google.cloud.logging
logging.basicConfig(format="[%(asctime)s][%(levelname)s] %(message)s", level=logging.DEBUG, stream=sys.stdout)
logger = logging.getLogger(__name__)
logging_client = google.cloud.logging.Client()
logging_client.setup_logging()
logger.setLevel(logging.DEBUG)
logger.debug("logger log for sample_logging")
こうすると、severityはINFOででます(DEBUGではない)
structured logで標準エラー出力にだしてみる(実装割愛)と下記のような結果になりました。
Conclusion
Batchでは、unstructured logだと標準出力にログを出すとseverityはINFO、標準エラー出力だとseverityはERRORになる。
structured logであれば、標準出力、標準エラー出力にかかわらず指定したseverityでログがでる。
なにかの参考になれば!
Discussion