def _LogFilterForIds(log_ids, parent): """Constructs a log filter expression from the log_ids and parent name.""" if not log_ids: return None log_names = ['"{0}"'.format(util.CreateLogResourceName(parent, log_id)) for log_id in log_ids] log_names = ' OR '.join(log_names) if len(log_ids) > 1: log_names = '(%s)' % log_names return 'logName=%s' % log_names
def _LogFilterForIds(log_ids, parent): """Constructs a log filter expression from the log_ids and parent name.""" if not log_ids: return None log_names = ['"%s"' % util.CreateLogResourceName(parent, log_id) for log_id in log_ids] log_names = ' OR '.join(log_names) # TODO(b/27930464): Always use parentheses when resolved if len(log_ids) > 1: log_names = '(%s)' % log_names return 'logName=%s' % log_names
def FetchLogs(log_filter=None, log_ids=None, order_by='DESC', limit=None): """Fetches log entries. This method uses Cloud Logging V2 api. https://cloud.google.com/logging/docs/api/introduction_v2 Entries are sorted on the timestamp field, and afterwards filter is applied. If limit is passed, returns only up to that many matching entries. It is recommended to provide a filter with resource.type, and log_ids. Args: log_filter: filter expression used in the request. log_ids: if present, contructs full log names and passes it in filter. order_by: the sort order, either DESC or ASC. limit: how many entries to return. Returns: A generator that returns matching log entries. Callers are responsible for handling any http exceptions. """ client = apis.GetClientInstance('logging', 'v2beta1') messages = apis.GetMessagesModule('logging', 'v2beta1') project = properties.VALUES.core.project.Get(required=True) if order_by.upper() == 'DESC': order_by = 'timestamp desc' else: order_by = 'timestamp asc' if log_ids is not None: log_names = ['"%s"' % util.CreateLogResourceName(project, log_id) for log_id in log_ids] log_names = ' OR '.join(log_names) # TODO(b/27930464): Always use parentheses when resolved if len(log_ids) > 1: log_names = '(%s)' % log_names if log_filter: log_filter = 'logName=%s AND (%s)' % (log_names, log_filter) else: log_filter = 'logName=%s' % log_names request = messages.ListLogEntriesRequest( projectIds=[project], filter=log_filter, orderBy=order_by) # The backend has an upper limit of 1000 for page_size. # However, there is no need to retrieve more entries if limit is specified. page_size = min(limit, 1000) or 1000 return list_pager.YieldFromList( client.entries, request, field='entries', limit=limit, batch_size=page_size, batch_size_attribute='pageSize')
def Run(self, args): """This is what gets called when the user runs this command. Args: args: an argparse namespace. All the arguments that were provided to this command invocation. """ console_io.PromptContinue( 'Really delete all log entries from [%s]?' % args.log_name, cancel_on_no=True) util.GetClient().projects_logs.Delete( util.GetMessages().LoggingProjectsLogsDeleteRequest( logName=util.CreateLogResourceName( util.GetCurrentProjectParent(), args.log_name))) log.DeletedResource(args.log_name)
def Run(self, args): """This is what gets called when the user runs this command. Args: args: an argparse namespace. All the arguments that were provided to this command invocation. """ project = properties.VALUES.core.project.Get(required=True) if not console_io.PromptContinue( 'Really delete all log entries from [%s]?' % args.log_name): raise exceptions.ToolException('action canceled by user') # TODO(b/32504514): Use resource parser util.GetClient().projects_logs.Delete( util.GetMessages().LoggingProjectsLogsDeleteRequest( logName=util.CreateLogResourceName( 'projects/{0}'.format(project), args.log_name))) log.DeletedResource(args.log_name)
def Run(self, args): """This is what gets called when the user runs this command. Args: args: an argparse namespace. All the arguments that were provided to this command invocation. """ client = self.context['logging_client_v2beta1'] messages = self.context['logging_messages_v2beta1'] project = properties.VALUES.core.project.Get(required=True) severity_value = getattr(messages.LogEntry.SeverityValueValuesEnum, args.severity.upper()) entry = messages.LogEntry( logName=util.CreateLogResourceName('projects/{0}'.format(project), args.log_name), resource=messages.MonitoredResource(type='global'), severity=severity_value) if args.payload_type == 'json' or args.payload_type == 'struct': json_object = util.ConvertToJsonObject(args.message) struct = messages.LogEntry.JsonPayloadValue() # Protobufs in Python do strict type-checking. We have to change the # type from JsonObject.Property to JsonPayloadValue.AdditionalProperty # even though both types have the same fields (key, value). struct.additionalProperties = [ messages.LogEntry.JsonPayloadValue.AdditionalProperty( key=json_property.key, value=json_property.value) for json_property in json_object.properties ] entry.jsonPayload = struct else: entry.textPayload = args.message client.entries.Write( messages.WriteLogEntriesRequest(entries=[entry])) log.status.write('Created log entry.\n')