Best Practice für die Anmeldung im JSON-Format unter AWS Lambda / Python

Lambda speichert Protokolle automatisch in CloudWatch-Protokollen, CloudWatch-Protokolle können jedoch JSON-formatierte Protokolle automatisch analysieren, formatieren und durchsuchen. Auf jeden Fall möchte ich das Protokoll in das JSON-Format konvertieren.

Alle Artikel, die Google mit "python lambda logging json" gefunden hat, schienen jedoch unvollständig zu sein, sodass in diesem Artikel die Methode vorgestellt wird, die ich für die beste halte.

Ablehnung

Da die Standardbibliothek "Protokollierung" der Standard für die Python-Protokollausgabe ist, wird in diesem Artikel die Protokollierung vorausgesetzt.

Warum Sie print nicht verwenden sollten ・ Für die korrekte Verwendung der Protokollierung ist der Artikel "Bitte beenden Sie das Drucken und Importieren der Protokollierung für die Protokollausgabe" leicht zu verstehen. (Obwohl der Stil hart ist)

Dies ist (wahrscheinlich) die beste Vorgehensweise!

import logging
import json


#Schreiben Sie zu Beginn Ihre eigenen Formatierungsdefinitionen und Root-Logger-Einstellungen
class JsonFormatter:
    def format(self, record):
        return json.dumps(vars(record))

#Root-Logger-Einstellungen
logging.basicConfig() #Stellen Sie den Handler so ein, dass er auf Standardfehler ausgegeben wird
logging.getLogger().handlers[0].setFormatter(JsonFormatter()) #Ändern Sie das Ausgabeformat des Handlers in Ihr eigenes

#Holen Sie sich danach den Logger normal und schreiben Sie eine Funktion zur Verarbeitung
logger = logging.getLogger(__name__)
logger.setLevel(os.environ.get('LOG_LEVEL', 'INFO')) #Nebenbei: Es ist praktisch, die Protokollebene mit Umgebungsvariablen zu ändern.


def lambda_handler(event: dict, context):
   #Wenn Sie dem Protokoll zusätzliche Informationen hinzufügen möchten,`extra=`Diktat weitergeben an.
   #Dikt kann natürlich aus zwei oder mehr Elementen bestehen
   logger.info("sample", extra={"foo": 12, "bar": "Hello World!"})

** In CloudWatch-Protokollen gespeicherte Protokolle **: Die Ausgabe von logger.info ist JSON. Protokolle wie "START RequestId: ..." werden von AWS Lambda selbst ausgegeben und können nicht geändert werden.

START RequestId: 3ba9c9dd-0758-482e-8aa4-f5496fa49f04 Version: $LATEST
{
    "name": "lambda_function",
    "msg": "sample",
    "args": [],
    "levelname": "INFO",
    "levelno": 20,
    "pathname": "/var/task/lambda_function.py",
    "filename": "lambda_function.py",
    "module": "lambda_function",
    "exc_info": null,
    "exc_text": null,
    "stack_info": null,
    "lineno": 23,
    "funcName": "lambda_handler",
    "created": 1577152740.1250498,
    "msecs": 125.04982948303223,
    "relativeCreated": 64.58139419555664,
    "thread": 140315591210816,
    "threadName": "MainThread",
    "processName": "MainProcess",
    "process": 7,
    "foo": 12,
    "bar": "Hello World!",
    "aws_request_id": "3ba9c9dd-0758-482e-8aa4-f5496fa49f04"
}
END RequestId: 3ba9c9dd-0758-482e-8aa4-f5496fa49f04
REPORT RequestId: 3ba9c9dd-0758-482e-8aa4-f5496fa49f04	Duration: 1.76 ms	Billed Duration: 100 ms	Memory Size: 128 MB	Max Memory Used: 55 MB	Init Duration: 113.06 ms	

Temporärer Kommentar

(Einzelheiten finden Sie unter Offizielles Dokument)

logging.Logger hat eine hierarchische Struktur. Wenn Sie also das Gesamtformat ändern möchten, können Sie den Root-Logger (logging.getLogger ()) ändern. logging.basicConfig () legt den Handler für den Root-Logger fest, also legt .setFormatter () Ihren eigenen Formatierer fest.

Logging.LogRecord wird an .format (record) übergeben. Da dieses Objekt verschiedene Informationen als Attribute hat, wird es von "vars (record)" erfasst und in JSON konvertiert.

Der in extra = von logger.info übergebene Wert wird als Attribut von LogRecord gesetzt. Wenn Sie hier einen Schlüssel wie "msg", "funcName" verwenden, wird der ursprüngliche Wert überschrieben. Wenn Sie das Überschreiben wirklich vermeiden möchten, können Sie auch einen eigenen Logger definieren, der [.makeRecord] überschreibt (https://docs.python.org/ja/3/library/logging.html#logging.Logger.makeRecord). Ich kann es schaffen Ich zögere jedoch, weil der Code kompliziert wird.

Es ist einfach, oder?

Soll ich die Bibliothek benutzen?

Übrigens gibt es auf Github viele Bibliotheken, die Protokolle in JSON formatieren.

Ich empfehle jedoch nicht, eine solche Bibliothek zu verwenden. Dies liegt daran, dass durch die Einführung der Bibliothek Abhängigkeiten entstehen, die Upgrade-Aufwand und Sicherheitsrisiken verursachen (denken Sie an das linke Feld 2016!).

Wie oben erwähnt, kann JsonFormatter in nur 3 Zeilen geschrieben werden, daher denke ich, dass es am besten ist, den Code zu kopieren und schließlich einzufügen.

Verpassen Sie es nicht.

Recommended Posts

Best Practice für die Anmeldung im JSON-Format unter AWS Lambda / Python
[Python] Scraping in AWS Lambda
Ausgabeprotokoll im JSON-Format mit Python-Standardprotokollierung
Unterstützung für Python 2.7-Laufzeit auf AWS Lambda (ab 2020.1)
Schreiben Sie die AWS Lambda-Funktion in Python
Führen Sie Python planmäßig auf AWS Lambda aus
Anmerkung von nfc.ContactlessFrontend () von nfcpy von Python
[Python] Führen Sie Headless Chrome unter AWS Lambda aus
Das Modul kann nicht in Python auf EC2 importiert werden, das von AWS Lambda ausgeführt wird
Format in Python
Führen Sie regelmäßig Python-Programme auf AWS Lambda aus
Protokollierungseinstellungen für die tägliche Protokollrotation mit Python
Boost.NumPy Tutorial zum Erweitern von Python in C ++ (Übung)
Umgang mit Json in Python
Ordnungsgemäße Anmeldung in Python
Bildformat in Python
Stellen Sie die Python 3-Funktion mit Serverless Framework unter AWS Lambda bereit
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
Ich möchte Lambda mit Python auf Mac AWS!
Konvertieren / Zurückgeben von Klassenobjekten in das JSON-Format in Python
Vorgehensweise zum Erstellen eines Linienbot in AWS Lambda
[Python] Memo zur erneuten Verarbeitung (Exponential Backoff) in AWS Lambda
Entwicklung des AWS SDK für Python (Boto3) in Visual Studio 2017
Führen Sie das AWS IoT Device SDK für Python auf Raspberry Pi aus
Veröffentlichen Sie regelmäßig Bilder von Papillon auf Python + AWS Lambda + Slack
[Python] Ermöglicht den Import von pip3-Paketen in AWS Lambda
Techniken zum Sortieren in Python
Einführung in Python in der Praxis (PiP)
Formatieren Sie json mit Vim (mit Python)
Über "für _ in range ():" von Python
Wenn Sie Probleme mit Zeitüberschreitungen bei der Implementierung von Slacks SlashCommand in AWS Lambdas Python haben
Wettbewerb mit VS-Code Erstellen Sie eine Python-Umgebung für Profis unter Windows
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
xgboost (Python) in einer von AWS Lambda erstellten EC2 Spot-Instanzumgebung
[Python / AWS Lambda-Ebenen] Ich möchte nur Module in AWS Lambda-Ebenen wiederverwenden
Ich habe Node.js und Python beim Erstellen eines Miniaturbilds mit AWS Lambda verglichen
[Für Python] Erstellen Sie schnell eine Upload-Datei in AWS Lambda Layer
Überprüfen Sie Python auf Speicherlecks
Exportieren Sie DB-Daten im JSON-Format
Suchen Sie mit Python nach externen Befehlen
Zusammenfassung bei Verwendung von AWS Lambda (Python)
[Python] Anmelden Ihres eigenen Moduls
Schreiben Sie ein JSON-Schema mit Python DSL
Formatieren Sie Python-Code automatisch mit Vim
Behandeln Sie Daten im NetCDF-Format mit Python
Behandeln Sie das GDS II-Format mit Python
Laden Sie JSON-Typen dynamisch mit Python
Umgang mit JSON-Dateien in Python
boto3 (AWS SDK für Python) Hinweis
AWS Layer Creation Script für Python
Installieren Sie Confluent-Kafka für Python unter Ubuntu
Python-Protokollierung und Dump an JSON
Algorithmus (Segmentbaum) in Python (Übung)
Benachrichtigen Sie HipChat mit AWS Lambda (Python)
Führen Sie unittest in Python aus (für Anfänger)
AWS Lambda-Entwicklung Meine Best Practices