Saltar al contenido

Python / Boto: escritura en AWS CloudWatch Logs sin token de secuencia

Solución:

Código Putlogevent de AWS Cloud Watch

import boto3
import time


client = boto3.client('logs')

LOG_GROUP='cloudwatch_customlog'
LOG_STREAM='{}-{}'.format(time.strftime('%Y-%m-%d'),'logstream')

try:
   client.create_log_group(logGroupName=LOG_GROUP)
except client.exceptions.ResourceAlreadyExistsException:
   pass

try:
   client.create_log_stream(logGroupName=LOG_GROUP, logStreamName=LOG_STREAM)
except client.exceptions.ResourceAlreadyExistsException:
   pass

response = client.describe_log_streams(
   logGroupName=LOG_GROUP,
   logStreamNamePrefix=LOG_STREAM
)

event_log = {
   'logGroupName': LOG_GROUP,
   'logStreamName': LOG_STREAM,
   'logEvents': [
       {
           'timestamp': int(round(time.time() * 1000)),
           'message': time.strftime('%Y-%m-%d %H:%M:%S')+'t Your custom log messages'
       }
   ],
}

if 'uploadSequenceToken' in response['logStreams'][0]:
   event_log.update({'sequenceToken': response['logStreams'][0] ['uploadSequenceToken']})

response = client.put_log_events(**event_log)
print(response)

Puede evitarlo buscando primero el uploadSequenceToken a través de describe_log_streams ():

Básicamente, el proceso consiste en utilizar logStreamNamePrefix para identificar específicamente el flujo de registro al que desea agregar. Luego, analice uploadSequenceToken de la respuesta.

Sintaxis de respuesta

 {
     'logStreams': [
         {
             'logStreamName': 'string',
             'creationTime': 123,
             'firstEventTimestamp': 123,
             'lastEventTimestamp': 123,
             'lastIngestionTime': 123,
             'uploadSequenceToken': 'string',
             'arn': 'string',
             'storedBytes': 123
         },
     ],
     'nextToken': 'string'
 }

Devuelve todos los flujos de registros asociados con el grupo de registros especificado. La lista devuelta en la respuesta está ordenada en ASCII por nombre de flujo de registro.

De forma predeterminada, esta operación devuelve hasta 50 secuencias de registro. Si hay más secuencias de registro para enumerar, la respuesta contendrá un valor nextToken en el cuerpo de la respuesta. También puede limitar el número de flujos de registro devueltos en la respuesta especificando el parámetro de límite en la solicitud. Esta operación tiene un límite de cinco transacciones por segundo, después de lo cual se regulan las transacciones.

Solicitar sintaxis

response = client.describe_log_streams(
    logGroupName="string",
    logStreamNamePrefix='string',
    orderBy='LogStreamName'|'LastEventTime',
    descending=True|False,
    nextToken='string',
    limit=123
)

Para responder a la por qué parte con una suposición fundamentada: es la naturaleza de un servicio asincrónico escalable.

Si Amazon lo hiciera no pedirle que mantenga un número de secuencia, entonces nunca podrían escalar horizontalmente su servicio CloudWatch en muchas instancias y al mismo tiempo poder garantizar que sus registros aparezcan en el exacto en el mismo orden en que sucedieron (e imagínese lo molestas que serían las entradas de registro fuera de orden al depurar un problema). Cualquier pequeña desviación en los relojes, la latencia de la red u otro retraso en la ruta hacia los aceptadores de registros introduciría problemas de pedido.

Pero ya que ellos hacer pedirle un número de secuencia, de repente pueden escalar su servicio fácilmente y simplemente fusionar y ordenar las entradas de registro entrantes mientras mantienen el orden de registro correcto, tu orden de registro.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *