Procesando logs de Cloudwatch


Cloudwatch Logs es la herramienta de AWS para coleccionar los de diversos sistemas, su usabilidad no es la mejor pero es económico y escalable.

A veces vale la pena procesar los logs de Cloudwatch para hacer ciertos análisis sobre lo que está sucediendo con la aplicación y poder tomar mejores decisiones.

En este artículo vamos a discutir cómo conectarnos al servicio por medio del API y cómo filtrar los logs.

Para hacer la conección simplemente tenemos que crear un cliente como se muestra a continuación:

opts := session.Options{
    SharedConfigState: session.SharedConfigEnable,
    Profile: "my-aws-profile-with-access-to-cloudwatch-logs",
}

sess := session.Must(session.NewSessionWithOptions(opts))
svc := cloudwatchlogs.New(sess)

en el ejemplo anterior, svc es un cliente de cloudwatch y ya se puede usar para consultarlo. El paso siguiente sería crear la petición para filtrar los logs:

startTime := time.Now().Add(-1 * time.Hour)
req := &cloudwatchlogs.FilterLogEventsInput{
    StartTime:     aws.Int64(startTime.UnixNano() / int64(time.Millisecond)),
    LogGroupName:  aws.String("my-log-group"),
    FilterPattern: aws.String(""), // https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html
}

La petición intentará extraer los logs de la última hora.

Lo siguiente es iterar para bajar todos los logs:

for {
    resp, err := svc.FilterLogEvents(req)
    if err != nil {
        panic(err)
    }

    for _, ev := range resp.Events {
        fmt.Println(*ev.Message)
    }

    if resp.NextToken == nil {
        break
    }

    req.NextToken = resp.NextToken
}

Es muy importante que sea una iteración porque algunas páginas llegan vacias, el código anterior se encarga de recorrer todo.

Una vez tengamos el mensaje de log ya podremos hacer lo que queramos con él.


Ver también