77 lines
2.9 KiB
Python
77 lines
2.9 KiB
Python
# -*- coding: utf-8 -*- #
|
|
# Copyright 2022 Google LLC. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
"""Formatter to parse logs into single lines."""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import unicode_literals
|
|
|
|
import datetime
|
|
|
|
from cloudsdk.google.protobuf import timestamp_pb2
|
|
from googlecloudsdk.api_lib.util import apis
|
|
from googlecloudsdk.command_lib.privateca import text_utils
|
|
|
|
|
|
def FormatLog(log):
|
|
"""Format logs for a service."""
|
|
is_log_entry = isinstance(log,
|
|
apis.GetMessagesModule('logging', 'v2').LogEntry)
|
|
log_entry_line = GetAttributeFieldFromLog('log_name', is_log_entry, log)
|
|
if not log_entry_line:
|
|
return ''
|
|
split_log = log_entry_line.split('%2F')
|
|
if len(split_log) < 2:
|
|
return ''
|
|
log_type = split_log[1]
|
|
log_output = [GetTimestampFromLogFormat(is_log_entry, log)]
|
|
if log_type == 'requests':
|
|
http_request = GetAttributeFieldFromLog('http_request', is_log_entry, log)
|
|
http_method = GetAttributeFieldFromLog('request_method', is_log_entry,
|
|
http_request)
|
|
status = GetAttributeFieldFromLog('status', is_log_entry, http_request)
|
|
url = GetAttributeFieldFromLog('request_url', is_log_entry, http_request)
|
|
log_output.append(http_method)
|
|
log_output.append(str(status))
|
|
log_output.append(url)
|
|
elif log_type == 'stderr' or log_type == 'stdout':
|
|
text_payload = GetAttributeFieldFromLog('text_payload', is_log_entry, log)
|
|
log_output.append(text_payload)
|
|
else:
|
|
return ''
|
|
return ' '.join(log_output)
|
|
|
|
|
|
def GetTimestampFromLogFormat(is_log_entry, log):
|
|
"""Returns timestamp in 'YYYY-MM-DD HH:MM:SS' string format."""
|
|
timestamp = GetAttributeFieldFromLog('timestamp', is_log_entry, log)
|
|
if is_log_entry:
|
|
ts = timestamp_pb2.Timestamp()
|
|
ts.FromJsonString(timestamp)
|
|
log_entry_timestamp = ts.ToDatetime()
|
|
return datetime.datetime.strftime(log_entry_timestamp, '%Y-%m-%d %H:%M:%S')
|
|
return datetime.datetime.strftime(timestamp, '%Y-%m-%d %H:%M:%S')
|
|
|
|
|
|
def GetAttributeFieldFromLog(field_name, is_log_entry, log_obj):
|
|
return getattr(log_obj, GetProperField(field_name, is_log_entry), '')
|
|
|
|
|
|
def GetProperField(field_name, is_log_entry):
|
|
"""Retrieve the proper atrribute from LogEntry depending if it is in MessageModule or GapiClient format."""
|
|
if not is_log_entry:
|
|
return field_name
|
|
return text_utils.SnakeCaseToCamelCase(field_name)
|