Which is a better way of saving Cloud Logging for Python in Cloud Functions?

There were multiple ways to save logs from Cloud Functions to Cloud Logging using Python, so I tried to organize the merits and demerits in a simple way.

TL;DR

ways 1.Standard Logger 2.Structured logging 3.Official logging handlers 4.Using Cloud Logging API directly
no needs to extra libraries
allows log severity
allows to add other fields
allows Python 3.7

1. using Standard Logging

This is the most simple way. You can use the standard logger, but it doesn’t support the severity.

The following code is an example using the standard logger in Cloud Functions.

<span>import</span> <span>logging</span>
<span>import</span> <span>flask</span>
<span>logger</span> <span>=</span> <span>logging</span><span>.</span><span>getLogger</span><span>()</span>
<span>logger</span><span>.</span><span>setLevel</span><span>(</span><span>logging</span><span>.</span><span>DEBUG</span><span>)</span>
<span>def</span> <span>main</span><span>(</span><span>request</span><span>):</span>
<span>print</span><span>(</span><span>"</span><span>PRINT message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>debug</span><span>(</span><span>"</span><span>DEBUG message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>info</span><span>(</span><span>"</span><span>INFO message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>warning</span><span>(</span><span>"</span><span>WARNING message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>error</span><span>(</span><span>"</span><span>ERROR message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>critical</span><span>(</span><span>"</span><span>CRITICAL message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>exception</span><span>(</span><span>"</span><span>EXCEPTION message</span><span>"</span><span>)</span>
<span>return</span> <span>flask</span><span>.</span><span>jsonify</span><span>({</span><span>'</span><span>result</span><span>'</span><span>:</span> <span>'</span><span>ok</span><span>'</span><span>})</span>
<span>import</span> <span>logging</span>

<span>import</span> <span>flask</span>

<span>logger</span> <span>=</span> <span>logging</span><span>.</span><span>getLogger</span><span>()</span>
<span>logger</span><span>.</span><span>setLevel</span><span>(</span><span>logging</span><span>.</span><span>DEBUG</span><span>)</span>

<span>def</span> <span>main</span><span>(</span><span>request</span><span>):</span>
    <span>print</span><span>(</span><span>"</span><span>PRINT message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>debug</span><span>(</span><span>"</span><span>DEBUG message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>info</span><span>(</span><span>"</span><span>INFO message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>warning</span><span>(</span><span>"</span><span>WARNING message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>error</span><span>(</span><span>"</span><span>ERROR message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>critical</span><span>(</span><span>"</span><span>CRITICAL message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>exception</span><span>(</span><span>"</span><span>EXCEPTION message</span><span>"</span><span>)</span>
    <span>return</span> <span>flask</span><span>.</span><span>jsonify</span><span>({</span><span>'</span><span>result</span><span>'</span><span>:</span> <span>'</span><span>ok</span><span>'</span><span>})</span>
import logging import flask logger = logging.getLogger() logger.setLevel(logging.DEBUG) def main(request): print("PRINT message") logger.debug("DEBUG message") logger.info("INFO message") logger.warning("WARNING message") logger.error("ERROR message") logger.critical("CRITICAL message") logger.exception("EXCEPTION message") return flask.jsonify({'result': 'ok'})

Enter fullscreen mode Exit fullscreen mode

The following was the actual screenshot from the Cloud Functions console.
You can see that all severity of entries are default.

2. using Structured logging

If you want to include log levels or other specific fields in your log entries, you can write logs to stdout or stderr in the form of a single line of serialized JSON. The Structured logging support is available in Python 3.8 and later.

https://cloud.google.com/functions/docs/monitoring/logging#writing_structured_logs

The following code is an example using the Structured logging in Cloud Functions.

<span>import</span> <span>logging</span>
<span>import</span> <span>flask</span>
<span>logger</span> <span>=</span> <span>logging</span><span>.</span><span>getLogger</span><span>()</span>
<span>logger</span><span>.</span><span>setLevel</span><span>(</span><span>logging</span><span>.</span><span>DEBUG</span><span>)</span>
<span>def</span> <span>main</span><span>(</span><span>request</span><span>):</span>
<span>print</span><span>(</span><span>"</span><span>PRINT message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>debug</span><span>(</span><span>"</span><span>DEBUG message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>info</span><span>(</span><span>"</span><span>INFO message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>warning</span><span>(</span><span>"</span><span>WARNING message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>error</span><span>(</span><span>"</span><span>ERROR message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>critical</span><span>(</span><span>"</span><span>CRITICAL message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>exception</span><span>(</span><span>"</span><span>EXCEPTION message</span><span>"</span><span>)</span>
<span>return</span> <span>flask</span><span>.</span><span>jsonify</span><span>({</span><span>'</span><span>result</span><span>'</span><span>:</span> <span>'</span><span>ok</span><span>'</span><span>})</span>
<span>import</span> <span>logging</span>

<span>import</span> <span>flask</span>

<span>logger</span> <span>=</span> <span>logging</span><span>.</span><span>getLogger</span><span>()</span>
<span>logger</span><span>.</span><span>setLevel</span><span>(</span><span>logging</span><span>.</span><span>DEBUG</span><span>)</span>

<span>def</span> <span>main</span><span>(</span><span>request</span><span>):</span>
    <span>print</span><span>(</span><span>"</span><span>PRINT message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>debug</span><span>(</span><span>"</span><span>DEBUG message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>info</span><span>(</span><span>"</span><span>INFO message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>warning</span><span>(</span><span>"</span><span>WARNING message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>error</span><span>(</span><span>"</span><span>ERROR message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>critical</span><span>(</span><span>"</span><span>CRITICAL message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>exception</span><span>(</span><span>"</span><span>EXCEPTION message</span><span>"</span><span>)</span>
    <span>return</span> <span>flask</span><span>.</span><span>jsonify</span><span>({</span><span>'</span><span>result</span><span>'</span><span>:</span> <span>'</span><span>ok</span><span>'</span><span>})</span>
import logging import flask logger = logging.getLogger() logger.setLevel(logging.DEBUG) def main(request): print("PRINT message") logger.debug("DEBUG message") logger.info("INFO message") logger.warning("WARNING message") logger.error("ERROR message") logger.critical("CRITICAL message") logger.exception("EXCEPTION message") return flask.jsonify({'result': 'ok'})

Enter fullscreen mode Exit fullscreen mode

The following was the actual screenshot from the Cloud Functions console.
You can see that all severity has been correctly reflected.

When I tried on Python 3.7 runtime, the severity didn’t support below as described in Official Doc.

3. using Official logging handlers

Logging handlers with Python loggers are provided by the official library.

https://cloud.google.com/logging/docs/setup/python#configuring_the_logging_handler

The following code is an example using the logging handlers in Cloud Functions. (The library version of google-cloud-logging I used was 2.7.0. )

<span>import</span> <span>logging</span>
<span>import</span> <span>flask</span>
<span>import</span> <span>google.cloud.logging</span>
<span>client</span> <span>=</span> <span>google</span><span>.</span><span>cloud</span><span>.</span><span>logging</span><span>.</span><span>Client</span><span>()</span>
<span>client</span><span>.</span><span>setup_logging</span><span>()</span>
<span>logger</span> <span>=</span> <span>logging</span><span>.</span><span>getLogger</span><span>()</span>
<span>logger</span><span>.</span><span>setLevel</span><span>(</span><span>logging</span><span>.</span><span>DEBUG</span><span>)</span>
<span>def</span> <span>main</span><span>(</span><span>request</span><span>):</span>
<span>print</span><span>(</span><span>"</span><span>PRINT message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>debug</span><span>(</span><span>"</span><span>DEBUG message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>info</span><span>(</span><span>"</span><span>INFO message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>warning</span><span>(</span><span>"</span><span>WARNING message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>error</span><span>(</span><span>"</span><span>ERROR message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>critical</span><span>(</span><span>"</span><span>CRITICAL message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>exception</span><span>(</span><span>"</span><span>EXCEPTION message</span><span>"</span><span>)</span>
<span>return</span> <span>flask</span><span>.</span><span>jsonify</span><span>({</span><span>'</span><span>result</span><span>'</span><span>:</span> <span>'</span><span>ok</span><span>'</span><span>})</span>
<span>import</span> <span>logging</span>

<span>import</span> <span>flask</span>
<span>import</span> <span>google.cloud.logging</span>

<span>client</span> <span>=</span> <span>google</span><span>.</span><span>cloud</span><span>.</span><span>logging</span><span>.</span><span>Client</span><span>()</span>
<span>client</span><span>.</span><span>setup_logging</span><span>()</span>
<span>logger</span> <span>=</span> <span>logging</span><span>.</span><span>getLogger</span><span>()</span>
<span>logger</span><span>.</span><span>setLevel</span><span>(</span><span>logging</span><span>.</span><span>DEBUG</span><span>)</span>

<span>def</span> <span>main</span><span>(</span><span>request</span><span>):</span>
    <span>print</span><span>(</span><span>"</span><span>PRINT message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>debug</span><span>(</span><span>"</span><span>DEBUG message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>info</span><span>(</span><span>"</span><span>INFO message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>warning</span><span>(</span><span>"</span><span>WARNING message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>error</span><span>(</span><span>"</span><span>ERROR message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>critical</span><span>(</span><span>"</span><span>CRITICAL message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>exception</span><span>(</span><span>"</span><span>EXCEPTION message</span><span>"</span><span>)</span>
    <span>return</span> <span>flask</span><span>.</span><span>jsonify</span><span>({</span><span>'</span><span>result</span><span>'</span><span>:</span> <span>'</span><span>ok</span><span>'</span><span>})</span>
import logging import flask import google.cloud.logging client = google.cloud.logging.Client() client.setup_logging() logger = logging.getLogger() logger.setLevel(logging.DEBUG) def main(request): print("PRINT message") logger.debug("DEBUG message") logger.info("INFO message") logger.warning("WARNING message") logger.error("ERROR message") logger.critical("CRITICAL message") logger.exception("EXCEPTION message") return flask.jsonify({'result': 'ok'})

Enter fullscreen mode Exit fullscreen mode

The following was the actual screenshot from the Cloud Functions console.
You can see that all severity has been correctly reflected.

4. using Cloud Logging API directly

The official Doc also explains how to run the API directly using the Cloud Logging API client.

https://cloud.google.com/logging/docs/setup/python#use_the_cloud_client_library_directly

The following code is an example using the calling directory in Cloud Functions. (The library version of google-cloud-logging I used was 2.7.0. )

<span>import</span> <span>flask</span>
<span>from</span> <span>google.cloud</span> <span>import</span> <span>logging</span>
<span>logging_client</span> <span>=</span> <span>logging</span><span>.</span><span>Client</span><span>()</span>
<span>log_name</span> <span>=</span> <span>"</span><span>hello-logging-func4</span><span>"</span>
<span>logger</span> <span>=</span> <span>logging_client</span><span>.</span><span>logger</span><span>(</span><span>log_name</span><span>)</span>
<span>def</span> <span>main</span><span>(</span><span>request</span><span>):</span>
<span>print</span><span>(</span><span>"</span><span>PRINT message</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>DEFAULT message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>DEFAULT</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>DEBUG message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>DEBUG</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>INFO message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>INFO</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>NOTICE message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>NOTICE</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>WARNING message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>WARNING</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>ERROR message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>ERROR</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>CRITICAL message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>CRITICAL</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>ALERT message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>ALERT</span><span>"</span><span>)</span>
<span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>EMERGENCY message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>EMERGENCY</span><span>"</span><span>)</span>
<span>return</span> <span>flask</span><span>.</span><span>jsonify</span><span>({</span><span>'</span><span>result</span><span>'</span><span>:</span> <span>'</span><span>ok</span><span>'</span><span>})</span>
<span>import</span> <span>flask</span>
<span>from</span> <span>google.cloud</span> <span>import</span> <span>logging</span>

<span>logging_client</span> <span>=</span> <span>logging</span><span>.</span><span>Client</span><span>()</span>
<span>log_name</span> <span>=</span> <span>"</span><span>hello-logging-func4</span><span>"</span>
<span>logger</span> <span>=</span> <span>logging_client</span><span>.</span><span>logger</span><span>(</span><span>log_name</span><span>)</span>

<span>def</span> <span>main</span><span>(</span><span>request</span><span>):</span>
    <span>print</span><span>(</span><span>"</span><span>PRINT message</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>DEFAULT message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>DEFAULT</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>DEBUG message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>DEBUG</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>INFO message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>INFO</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>NOTICE message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>NOTICE</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>WARNING message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>WARNING</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>ERROR message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>ERROR</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>CRITICAL message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>CRITICAL</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>ALERT message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>ALERT</span><span>"</span><span>)</span>
    <span>logger</span><span>.</span><span>log_text</span><span>(</span><span>"</span><span>EMERGENCY message</span><span>"</span><span>,</span> <span>severity</span><span>=</span><span>"</span><span>EMERGENCY</span><span>"</span><span>)</span>
    <span>return</span> <span>flask</span><span>.</span><span>jsonify</span><span>({</span><span>'</span><span>result</span><span>'</span><span>:</span> <span>'</span><span>ok</span><span>'</span><span>})</span>
import flask from google.cloud import logging logging_client = logging.Client() log_name = "hello-logging-func4" logger = logging_client.logger(log_name) def main(request): print("PRINT message") logger.log_text("DEFAULT message", severity="DEFAULT") logger.log_text("DEBUG message", severity="DEBUG") logger.log_text("INFO message", severity="INFO") logger.log_text("NOTICE message", severity="NOTICE") logger.log_text("WARNING message", severity="WARNING") logger.log_text("ERROR message", severity="ERROR") logger.log_text("CRITICAL message", severity="CRITICAL") logger.log_text("ALERT message", severity="ALERT") logger.log_text("EMERGENCY message", severity="EMERGENCY") return flask.jsonify({'result': 'ok'})

Enter fullscreen mode Exit fullscreen mode

The following was the actual screenshot from the Cloud Functions console, but you cannot see all of the log entries.

You can see all of the log entries from the Cloud Logging console.

Conclusion

This post introduced ways of saving Cloud Logging for Python in Cloud Functions and organized the merits and demerits in a simple way.

If you don’t need a log level, I recommend using Python Standard Logger(No.1).

If you need a log level, I recommend using official logging handlers(No.3) because you can setup easily. Or I recommend using Structured logging(No.2) because it is very flexible.

原文链接:Which is a better way of saving Cloud Logging for Python in Cloud Functions?

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
May we all have the power to love ourselves and others.
愿我们,都有能力爱自己,有余力爱别人
评论 抢沙发

请登录后发表评论

    暂无评论内容