func getLogs()

in internal/cmd/logs/util.go [55:120]


func getLogs(stackName, resourceName string) (events, error) {
	spinner.Push(fmt.Sprintf("Getting logs for stack '%s'", stackName))

	var logs events
	var err error

	// Get logs
	logs, err = cfn.GetStackEvents(stackName)
	if err != nil {
		return nil, err
	}

	if resourceName != "" {
		// Filter by resource
		newLogs := make([]types.StackEvent, 0)

		for _, log := range logs {
			if ptr.ToString(log.LogicalResourceId) == resourceName {
				newLogs = append(newLogs, log)
			}
		}

		logs = newLogs
	} else {
		// See if we have nested stacks (don't get these if we've specified a resource)
		resources, err := cfn.GetStackResources(stackName)
		if err != nil {
			return nil, err
		}

		for _, resource := range resources {
			if ptr.ToString(resource.ResourceType) == "AWS::CloudFormation::Stack" {
				if resource.PhysicalResourceId != nil {
					nestedLogs, err := getLogs(ptr.ToString(resource.PhysicalResourceId), "")
					if err != nil {
						return nil, err
					}

					logs = append(logs, nestedLogs...)
				}
			}
		}
	}

	// Filter out uninteresting messages
	newLogs := make([]types.StackEvent, 0)
	for _, log := range logs {
		if allLogs || (log.ResourceStatusReason != nil && !uninterestingMessages[*log.ResourceStatusReason]) {
			newLogs = append(newLogs, log)
		}
	}
	logs = newLogs

	// Sort by timestamp
	sort.Sort(logs)

	// Reverse order
	for i := len(logs)/2 - 1; i >= 0; i-- {
		j := len(logs) - 1 - i
		logs[i], logs[j] = logs[j], logs[i]
	}

	spinner.Pop()

	return logs, nil
}