Blog

So suchen und finden Sie verwandte Protokolle in AWS Log Groups

Joris Conijn

Aktualisiert Oktober 20, 2025
3 Minuten

Sie können über Protokollgruppen hinweg suchen, indem Sie eine Korrelations-ID für Ihre Protokollzeilen einrichten. Sie können dann CloudWatch Logs Insights verwenden, um alle zugehörigen Protokollmeldungen abzufragen. Wenn Sie in einem Projekt mit verschiedenen Lambda-Funktionen arbeiten, haben Sie vielleicht noch kein Protokollierungssystem. Die Suche und Fehlersuche mit Cloudwatch Logs könnte mühsam werden. Vor allem, wenn Sie versuchen, einen Fluss durch die verschiedenen Protokollgruppen zu verfolgen. In CloudWatch Logs Insights können Sie Abfragen über Protokollgruppen hinweg durchführen. In unserem Fall möchten wir zusammenhängende Protokollzeilen über Protokollgruppen hinweg sammeln. Um dies zu erreichen, müssen wir die Protokollzeilen mit einer correlation_id versehen, die sie miteinander verknüpft.

Anwendungsbeispiel

Anhand der folgenden Beispielanwendung wollen wir Ihnen zeigen, wie Sie eine Korrelations-ID für Ihre Protokollzeilen einrichten. Die Anwendung sieht wie folgt aus:

  1. API-Gateway, das eine AWS Lambda-Funktion aufruft
  2. Eine api Lambda-Funktion stellt die body in eine SQS-Warteschlange
  3. Eine callback Lambda-Funktion empfängt Nachrichten von der SQS-Warteschlange Jedes Mal, wenn ein API-Aufruf ausgeführt wird, wird die Funktion apiaufgerufen. Mit den Lambda Powertools für Python können wir die Protokollzeilen mit Anmerkungen versehen.
from aws_lambda_powertools import Logger
from aws_lambda_powertools.logging import correlation_paths
from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools.utilities.data_classes import (
    event_source,
    APIGatewayProxyEvent,
)
logger = Logger(service="api")

@event_source(data_class=APIGatewayProxyEvent)
@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST)
def lambda_handler(event: APIGatewayProxyEvent, context: LambdaContext) -> dict:
    logger.info("This message now has a correlation_id set")

Wir nehmen die requestContext.requestId aus dem eingehenden Ereignis. Diese können wir als verwenden. (Sie wird von API Gateway standardmäßig auch als Header an den Aufrufer zurückgegeben.)Um mit derselben Korrelations-ID in verschiedenen Protokollgruppen suchen zu können. Wir müssen sie zusammen mit der Nachricht als Attribut weitergeben, wenn wir sie an SQS senden.

    response = client.send_message(
        QueueUrl=os.environ.get("QUEUE_URL"),
        MessageBody=json.dumps(event.body),
        MessageAttributes={
            "correlation_id": {
                "DataType": "String",
                "StringValue": event.request_context.request_id,
            }
        },
    )

Ich habe ein correlation_id Attribut verwendet, um die Korrelations-ID mit der SQS-Nachricht zu übergeben. Die Warteschlange löst die Callback-Funktion mit einem Stapel von Nachrichten aus. Sie müssen die Nachrichten im Stapel in einer Schleife durchlaufen. Verarbeiten Sie sie und entfernen Sie sie aus der Warteschlange. Oder Sie verwenden den sqs_batch_processor aus den Powertools.

from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools.utilities.batch import sqs_batch_processor
from aws_lambda_powertools.utilities.data_classes.sqs_event import SQSRecord
logger = Logger(service="callback")

def record_handler(record: dict) -> None:
    record = SQSRecord(record)
    # Get the correlation id from the message attributes
    correlation_id = record.message_attributes["correlation_id"].string_value
    logger.set_correlation_id(correlation_id)
    logger.info(f"Processing message with {correlation_id} as correlation_id")

@sqs_batch_processor(record_handler=record_handler)
def lambda_handler(event: dict, context: LambdaContext) -> None:
    logger.set_correlation_id(None)
    logger.info(f"Received a SQSEvent with {len(list(event.records))} records")

Der sqs_batch_processor Dekorator ruft die Methode record_handler für jeden empfangenen Datensatz auf. Sie brauchen sich nicht um das Löschen von Nachrichten zu kümmern.Am Ende setzen wir die Korrelations-ID auf . Wir tun dies, weil der Rest der Protokollzeilen keinen Bezug zu der empfangenen Nachricht hat.

Zeigen Sie es mir!

Wenn Sie die API mit einem einfachen curl-Befehl aufrufen, sehen Sie die correlation_id (Hinweis: dies steht auch in den Headern)

Stellen Sie sich also vor, dass etwas schief gelaufen ist. Wir kennen die correlation_id, also verwenden wir CloudWatch Logs Insights:

fields level, service, message
| filter correlation_id="263021ca-fb82-41ff-96ad-2e933aadbe0a"
| sort @timestamp desc
Beispielabfrage von AWS CloudWatch Logs Insights

Wie Sie sehen, gibt es 3 Ergebnisse. 2 Zeilen stammen vom Dienst api und 1 vom Dienst callback. Wenn Sie wissen möchten, wie Sie Abfragen erstellen, können Sie die Abfragesyntax von CloudWatch Logs Insights lesen.

Fazit

Die Lambda Powertools für Python erleichtern das Hinzufügen einer correlation_id. Mit den strukturierten Protokollen aus den Powertools können Sie jede Eigenschaft in der Protokollzeile verwenden, um abzufragen. Es gibt noch viele weitere Hilfsprogramme, also schauen Sie doch mal rein! Sie sind kein Python-Entwickler? Es gibt eine Java Version und es gibt einige Initiativen auf der Roadmap , um auch andere Sprachen hinzuzufügen.

Verfasst von

Joris Conijn

Joris is the AWS Practise CTO of the Xebia Cloud service line and has been working with the AWS cloud since 2009 and focussing on building event-driven architectures. While working with the cloud from (almost) the start, he has seen most of the services being launched. Joris strongly believes in automation and infrastructure as code and is open to learning new things and experimenting with them because that is the way to learn and grow.

Contact

Let’s discuss how we can support your journey.