Exemple #1
0
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
Exemple #3
0
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')
Exemple #4
0
  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)
Exemple #5
0
    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)
Exemple #6
0
  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')