Golang을 사용한 AWS CloudWatch 로깅
16169 단어 loggingawsgoobservability
Youtube Video 에서 모든 것을 설명했기 때문에 이 게시물에서는 코드를 검토하지 않겠습니다. 하지만 여기 있습니다. Githubhere에서 최신 버전을 찾을 수 있습니다.
package main
import (...)
var (
cwl *cloudwatchlogs.CloudWatchLogs
logGroupName = "youtubeTest"
logStreamName = ""
sequenceToken = ""
)
func init() {
sess, err := session.NewSessionWithOptions(session.Options{
Config: aws.Config{
Region: aws.String("eu-west-2"), // london
},
})
if err != nil {
panic(err)
}
cwl = cloudwatchlogs.New(sess)
err = ensureLogGroupExists(logGroupName)
if err != nil {
panic(err)
}
}
func main() {
queue := []string{}
lock := sync.Mutex{}
go datasource.GenerateData(&queue, &lock)
go processQueue(&queue, &lock)
// to stop the code from exiting
wg := sync.WaitGroup{}
wg.Add(1)
wg.Wait()
}
// ensureLogGroupExists first checks if the log group exists,
// if it doesn't it will create one.
func ensureLogGroupExists(name string) error {
resp, err := cwl.DescribeLogGroups(&cloudwatchlogs.DescribeLogGroupsInput{})
if err != nil {
return err
}
for _, logGroup := range resp.LogGroups {
if *logGroup.LogGroupName == name {
return nil
}
}
_, err = cwl.CreateLogGroup(&cloudwatchlogs.CreateLogGroupInput{
LogGroupName: &name,
})
if err != nil {
return err
}
_, err = cwl.PutRetentionPolicy(&cloudwatchlogs.PutRetentionPolicyInput{
RetentionInDays: aws.Int64(14),
LogGroupName: &name,
})
return err
}
// createLogStream will make a new logStream with a random uuid as its name.
func createLogStream() error {
name := uuid.New().String()
_, err := cwl.CreateLogStream(&cloudwatchlogs.CreateLogStreamInput{
LogGroupName: &logGroupName,
LogStreamName: &name,
})
logStreamName = name
return err
}
// processQueue will process the log queue
func processQueue(queue *[]string, lock *sync.Mutex) error {
var logQueue []*cloudwatchlogs.InputLogEvent
for {
lock.Lock()
if len(*queue) > 0 {
for _, item := range *queue {
logQueue = append(logQueue, &cloudwatchlogs.InputLogEvent{
Message: &item,
Timestamp: aws.Int64(time.Now().UnixNano() / int64(time.Millisecond)),
})
}
*queue = []string{}
}
lock.Unlock()
if len(logQueue) > 0 {
input := cloudwatchlogs.PutLogEventsInput{
LogEvents: logQueue,
LogGroupName: &logGroupName,
}
if sequenceToken == "" {
err := createLogStream()
if err != nil {
panic(err)
}
} else {
input = *input.SetSequenceToken(sequenceToken)
}
input = *input.SetLogStreamName(logStreamName)
resp, err := cwl.PutLogEvents(&input)
if err != nil {
log.Println(err)
}
if resp != nil {
sequenceToken = *resp.NextSequenceToken
}
logQueue = []*cloudwatchlogs.InputLogEvent{}
}
time.Sleep(time.Second * 5)
}
}
올바르게 완료되면 logGroup의 단일 logStream이 로그 메시지로 채워지는 것을 볼 수 있습니다.
여러 인스턴스를 실행 중인 경우(아래 그림과 같이) 여러 logStream이 표시될 수 있습니다.
Reference
이 문제에 관하여(Golang을 사용한 AWS CloudWatch 로깅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mathisve/aws-cloudwatch-logging-with-golang-25fi텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)