github.com/kolanos/fargate@v0.2.3/cloudwatchlogs/log_group.go (about)

     1  package cloudwatchlogs
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/aws/aws-sdk-go/aws"
     8  	"github.com/aws/aws-sdk-go/aws/awserr"
     9  	awscwl "github.com/aws/aws-sdk-go/service/cloudwatchlogs"
    10  	"github.com/jpignata/fargate/console"
    11  )
    12  
    13  type GetLogsInput struct {
    14  	Filter         string
    15  	LogGroupName   string
    16  	LogStreamNames []string
    17  	EndTime        time.Time
    18  	StartTime      time.Time
    19  }
    20  
    21  type LogLine struct {
    22  	EventId       string
    23  	LogStreamName string
    24  	Message       string
    25  	Timestamp     time.Time
    26  }
    27  
    28  func (cwl *CloudWatchLogs) CreateLogGroup(logGroupName string, a ...interface{}) string {
    29  	formattedLogGroupName := fmt.Sprintf(logGroupName, a...)
    30  	_, err := cwl.svc.CreateLogGroup(
    31  		&awscwl.CreateLogGroupInput{
    32  			LogGroupName: aws.String(formattedLogGroupName),
    33  		},
    34  	)
    35  
    36  	if err != nil {
    37  		if awsErr, ok := err.(awserr.Error); ok {
    38  			switch awsErr.Code() {
    39  			case awscwl.ErrCodeResourceAlreadyExistsException:
    40  				return formattedLogGroupName
    41  			default:
    42  				console.ErrorExit(awsErr, "Could not create Cloudwatch Logs log group")
    43  			}
    44  		}
    45  	}
    46  
    47  	return formattedLogGroupName
    48  }
    49  
    50  func (cwl *CloudWatchLogs) GetLogs(i *GetLogsInput) []LogLine {
    51  	var logLines []LogLine
    52  
    53  	input := &awscwl.FilterLogEventsInput{
    54  		LogGroupName: aws.String(i.LogGroupName),
    55  		Interleaved:  aws.Bool(true),
    56  	}
    57  
    58  	if !i.StartTime.IsZero() {
    59  		input.SetStartTime(i.StartTime.UTC().UnixNano() / int64(time.Millisecond))
    60  	}
    61  
    62  	if !i.EndTime.IsZero() {
    63  		input.SetEndTime(i.EndTime.UTC().UnixNano() / int64(time.Millisecond))
    64  	}
    65  
    66  	if i.Filter != "" {
    67  		input.SetFilterPattern(i.Filter)
    68  	}
    69  
    70  	if len(i.LogStreamNames) > 0 {
    71  		input.SetLogStreamNames(aws.StringSlice(i.LogStreamNames))
    72  	}
    73  
    74  	err := cwl.svc.FilterLogEventsPages(
    75  		input,
    76  		func(resp *awscwl.FilterLogEventsOutput, lastPage bool) bool {
    77  			for _, event := range resp.Events {
    78  				logLines = append(logLines,
    79  					LogLine{
    80  						EventId:       aws.StringValue(event.EventId),
    81  						Message:       aws.StringValue(event.Message),
    82  						LogStreamName: aws.StringValue(event.LogStreamName),
    83  						Timestamp:     time.Unix(0, aws.Int64Value(event.Timestamp)*int64(time.Millisecond)),
    84  					},
    85  				)
    86  
    87  			}
    88  
    89  			return true
    90  		},
    91  	)
    92  
    93  	if err != nil {
    94  		console.ErrorExit(err, "Could not get logs")
    95  	}
    96  
    97  	return logLines
    98  }