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