Bonnes pratiques pour la journalisation au format JSON sur AWS Lambda / Python

Lambda enregistre automatiquement les journaux dans CloudWatch Logs, mais CloudWatch Logs a la capacité d'analyser, de formater et de rechercher automatiquement les journaux au format JSON. Par tous les moyens, je voudrais convertir le journal au format JSON.

Cependant, tous les articles trouvés par google avec "python lambda logging json" semblaient incomplets, donc cet article présentera la méthode que je pense être la meilleure.

Refus

Étant donné que la bibliothèque standard logging est la norme pour la sortie de journal Python, cet article suppose la journalisation.

Pourquoi vous ne devriez pas utiliser print ・ Pour une utilisation correcte de la journalisation, l'article «Veuillez arrêter l'impression et importer la journalisation pour la sortie du journal» est facile à comprendre. (Bien que le style soit dur)

C'est (probablement) la meilleure pratique!

import logging
import json


#Au début, écrivez votre propre définition du formateur et les paramètres de l'enregistreur racine
class JsonFormatter:
    def format(self, record):
        return json.dumps(vars(record))

#Paramètres de l'enregistreur racine
logging.basicConfig() #Définir le gestionnaire pour générer une erreur standard
logging.getLogger().handlers[0].setFormatter(JsonFormatter()) #Changer le format de sortie du gestionnaire pour le vôtre

#Après cela, récupérez le logger normalement et écrivez une fonction pour le traitement
logger = logging.getLogger(__name__)
logger.setLevel(os.environ.get('LOG_LEVEL', 'INFO')) #A part: il est pratique de rendre le niveau de journal modifiable avec des variables d'environnement.


def lambda_handler(event: dict, context):
   #Si vous souhaitez ajouter des informations supplémentaires au journal,`extra=`Passez dict à.
   #Bien sûr, dict peut être composé de 2 éléments ou plus
   logger.info("sample", extra={"foo": 12, "bar": "Hello World!"})

** Journaux stockés dans CloudWatch Logs **: La sortie de logger.info est JSON. Les journaux tels que «START RequestId: ...» sont émis par AWS Lambda lui-même et ne peuvent pas être modifiés.

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	

Commentaire temporaire

(Pour plus de détails, reportez-vous au Document officiel)

logging.Logger a une structure hiérarchique, donc si vous voulez changer le format global, vous pouvez changer le logger racine (logging.getLogger ()). logging.basicConfig () définit le gestionnaire de l'enregistreur racine, donc .setFormatter () définit votre propre formateur.

Logging.LogRecord est passé à .format (record). Puisque cet objet a diverses informations comme attributs, il est acquis par vars (record) et converti en JSON.

La valeur passée dans logger.info avec ʻextra =est définie comme attribut deLogRecord. Si vous utilisez une clé telle que msg, funcName` ici, la valeur d'origine sera écrasée. Si vous voulez vraiment éviter l'écrasement, vous pouvez également définir votre propre logger qui remplace .makeRecord. Je peux le faire. Cependant, je suis réticent car le code se complique.

C’est facile, non?

Dois-je utiliser la bibliothèque?

À propos, il existe de nombreuses bibliothèques sur Github qui formate les journaux en JSON.

Cependant, je ne recommande pas d'utiliser une telle bibliothèque. En effet, l'introduction de la bibliothèque crée des dépendances, ce qui pose un problème et un risque de sécurité (rappelez-vous le pavé gauche de 2016!).

Comme mentionné ci-dessus, JsonFormatter peut être écrit en seulement 3 lignes, donc je pense qu'il est préférable de copier et coller le code après tout.

Ne le manquez pas.

Recommended Posts

Bonnes pratiques pour la journalisation au format JSON sur AWS Lambda / Python
[Python] Scraping dans AWS Lambda
Journal de sortie au format JSON avec journalisation standard Python
Prise en charge de l'environnement d'exécution Python 2.7 sur AWS Lambda (à partir de 2020.1)
Ecrire une fonction AWS Lambda en Python
Exécutez Python selon la planification sur AWS Lambda
Note de nfc.ContactlessFrontend () de nfcpy de python
[Python] Exécutez Headless Chrome sur AWS Lambda
Le module ne peut pas être importé en Python sur EC2 exécuté à partir d'AWS Lambda
format en python
Exécutez régulièrement des programmes Python sur AWS Lambda
Paramètres de journalisation pour la rotation quotidienne des journaux avec python
Tutoriel Boost.NumPy pour l'extension de Python en C ++ (pratique)
Manipulation de json en python
Se connecter correctement en Python
Format d'image en Python
Déployer la fonction Python 3 avec Serverless Framework sur AWS Lambda
Créer une couche pour AWS Lambda Python dans Docker
Je veux AWS Lambda avec Python sur Mac!
Convertir / renvoyer des objets de classe au format JSON en Python
Procédure de création d'un Line Bot sur AWS Lambda
[Python] Retry processing (Exponential Backoff) mémo dans AWS Lambda
Développement du kit SDK AWS pour Python (Boto3) dans Visual Studio 2017
Exécutez AWS IoT Device SDK for Python sur Raspberry Pi
Publiez régulièrement des images de Papillon sur Python + AWS Lambda + Slack
[Python] Permet d'importer les packages pip3 sur AWS Lambda
Techniques de tri en Python
Présentation de Python en pratique (PiP)
Formater json avec Vim (avec python)
À propos de "for _ in range ():" de python
Si vous rencontrez des problèmes avec les délais d'expiration lors de la mise en œuvre de SlashCommand de Slack dans Python d'AWS Lambda
Concurrence avec VS Code Créez un environnement Python pour les professionnels sous Windows
[Python / Django] Créer une API Web qui répond au format JSON
xgboost (python) sur l'environnement d'instance EC2 Spot préparé par AWS Lambda
[Couches Python / AWS Lambda] Je souhaite réutiliser uniquement le module dans AWS Lambda Layers
J'ai comparé Node.js et Python lors de la création d'une miniature à l'aide d'AWS Lambda
[Pour Python] Créez rapidement un fichier de téléchargement vers AWS Lambda Layer
Rechercher les fuites de mémoire dans Python
Exporter les données DB au format json
Rechercher des commandes externes avec python
Récapitulatif si vous utilisez AWS Lambda (Python)
[Python] journalisation dans votre propre module
Ecrire un schéma JSON avec Python DSL
Formater automatiquement le code Python avec Vim
Gérez les données au format NetCDF avec Python
Gérez le format GDS II avec Python
Charger dynamiquement les types json avec python
Gestion des fichiers JSON en Python
Remarque sur boto3 (AWS SDK for Python)
Script de création de couche AWS pour python
Installez confluent-kafka pour Python sur Ubuntu
Journalisation Python et vidage vers json
Algorithme (arborescence de segments) en Python (s'entraîner)
Notifier HipChat avec AWS Lambda (Python)
Exécutez unittest en Python (pour les débutants)
Développement AWS Lambda Mes meilleures pratiques