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.
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)
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
(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?
Ü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