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.
É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)
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
(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 de
LogRecord. 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?
À 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