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.