问题描述
在将Google Cloud Function中的日志记录从内置的Python模块logging
更改为google.cloud.logging
时,遇到了导出异常和错误消息的问题。错误提示了错误的类型 – 期望字符串或类似字节的对象。
以下是错误的简化版本:
_ConvertFieldValuePair raise ParseError('Failed to parse {0} field: {1}.'.format(name, e)) google.protobuf.json_format.ParseError: Failedto parse textPayload field: expected string or bytes-like object.
以下是来自Google Cloud Logs的完整错误信息:
"/layers/google.python.pip/pip/lib/python3.9/site-packages/flask/app.py",line 2073, in wsgi_app response = self.full_dispatch_request() File"/layers/google.python.pip/pip/lib/python3.9/site-packages/flask/app.py",line 1518, in full_dispatch_request rv = self.handle_user_exception(e)File"/layers/google.python.pip/pip/lib/python3.9/site-packages/flask/app.py",line 1516, in full_dispatch_request rv = self.dispatch_request() File"/layers/google.python.pip/pip/lib/python3.9/site-packages/flask/app.py",line 1502, in dispatch_request returnself.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)File"/layers/google.python.pip/pip/lib/python3.9/site-packages/functions_framework/__init__.py",line 99, in view_func return function(request._get_current_object())File "/workspace/main.py", line 518, in get_sql_and_save_as_csv_in_gcsstore_duplicated_alids(conn_for_delete_insert, logger) File"/layers/google.python.pip/pip/lib/python3.9/site-packages/dryable/__init__.py",line 34, in _decorated return function( * args, ** kwargs ) File"/workspace/main.py", line 368, in store_duplicated_alidslogger.log_text(e) File"/layers/google.python.pip/pip/lib/python3.9/site-packages/google/cloud/logging_v2/logger.py",line 189, in log_text self._do_log(client, TextEntry, text, **kw) File"/layers/google.python.pip/pip/lib/python3.9/site-packages/google/cloud/logging_v2/logger.py",line 158, in _do_log client.logging_api.write_entries([api_repr]) File"/layers/google.python.pip/pip/lib/python3.9/site-packages/google/cloud/logging_v2/_gapic.py",line 151, in write_entries log_entry_pbs =[_log_entry_mapping_to_pb(entry) for entry in entries] File"/layers/google.python.pip/pip/lib/python3.9/site-packages/google/cloud/logging_v2/_gapic.py",line 151, in <listcomp> log_entry_pbs =[_log_entry_mapping_to_pb(entry) for entry in entries] File"/layers/google.python.pip/pip/lib/python3.9/site-packages/google/cloud/logging_v2/_gapic.py",line 542, in _log_entry_mapping_to_pb ParseDict(mapping, entry_pb)File"/layers/google.python.pip/pip/lib/python3.9/site-packages/google/protobuf/json_format.py",line 445, in ParseDict parser.ConvertMessage(js_dict, message) File"/layers/google.python.pip/pip/lib/python3.9/site-packages/google/protobuf/json_format.py",line 476, in ConvertMessage self._ConvertFieldValuePair(value,message) File"/layers/google.python.pip/pip/lib/python3.9/site-packages/google/protobuf/json_format.py",line 594, in _ConvertFieldValuePair raise ParseError('Failed to parse{0} field: {1}.'.format(name, e))google.protobuf.json_format.ParseError: Failed to parse textPayloadfield: expected string or bytes-like object.
用户想知道如何解决这个错误。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
解决方案1:使用字符串转换异常
你可以将所有的异常(和错误)转换为字符串。
示例:
except Exception as e:
logger.log_text(str(e))
raise
这是一个奇怪的解决方法,我本来期望该模块有更好的解决方案。我尝试了StackDriver Logging python exception in protobuf json_format.py,但没有成功。如果有其他想法,欢迎分享。
解决方案2:检查日志记录模块的配置
如果解决方案1不起作用,你可以检查日志记录模块的配置是否正确。确保你已正确配置google.cloud.logging
模块,并按照官方文档进行操作。
解决方案3:检查日志记录的文本类型
还有可能是日志记录的文本类型不正确导致的错误。请确保你的日志记录文本是字符串或类似字节的对象。如果不是,请进行相应的转换。
以上是解决这个错误的几种可能方法。根据你的具体情况选择适合你的解决方案。
正文完