Problème
Vous pouvez configurer l'agent Python pour log la sortie. Cette configuration permet à l'agent de vérifier s'il se connecte correctement à New Relic et si des erreurs se produisent. Ces informations seront utiles au support New Relic si vous rencontrez des problèmes.
Solution
Un logging debug
détaillé peut vous aider à résoudre les problèmes d’installation de votre agent Python standard.
Important
Certains partenaires utilisent des procédures différentes :
Pour activer le logging debug
:
Ouvrez votre newrelic.ini, généralement situé dans la hiérarchie de votre application.
Décommentez
#log_file = /tmp/newrelic-python-agent.log
. Assurez-vous que vous disposez des autorisations d'écriture sur l'emplacement log , en modifiant le chemin et le nom du fichier si nécessaire. S'il n'y a pas d'emplacement de fichier approprié, vous pouvez définirlog_file
surstderr
.Remplacez
log_level
pardebug
(au lieu deinfo
).Prudence
Le logging à
debug
peut générer beaucoup de données très rapidement. Monitorez attentivement la taille de votre fichier log , en remplaçantlog_level
parinfo
une fois le dépannage terminé.Enregistrez et fermez le fichier. Redémarrez votre application pour que les paramètres prennent effet.
Générez quelques minutes de trafic vers votre application.
Si vous envoyez votre fichier de log au support New Relic, joignez votre newrelic.ini à votre ticket d'assistance et indiquez au support votre fuseau horaire.
Important
Lorsque vous dépannagez votre agent Python New Relic, assurez-vous qu'il a été configuré pour générer un fichier log de niveau de débogage et monitorez de près la taille de votre fichier log . L'utilisation de log_level = debug
génère beaucoup de données très rapidement. Après avoir reproduit votre problème, renvoyez le fichier de log à log_level = info
.
se connecter à un fichier
L'agent utilise le module de logging Python pour générer le message de log. La sortie de l'agent doit donc être prise en compte dans la stratégie de logging globale de votre application.
Si vous n'utilisez pas le module de logging, l'agent fournit un moyen simplifié d'activer un fichier de log pour l'agent Python . Pour l'utiliser, définissez les options log_file
et log_level
dans le fichier de configuration de l'agent.
Example:
log_file = /tmp/newrelic-python-agent.loglog_level = info
Le chemin fourni pour log_file
doit être accessible en écriture pour l'utilisateur sous lequel votre application s'exécute.
Conseil
Si vous utilisez Apache/mod_wsgi
l'utilisateur Apache a un accès restreint au système de fichiers. Créez un répertoire spécial dans lequel le fichier de log peut être placé et qui est accessible en écriture à l'utilisateur Apache . Il est recommandé d'utiliser un chemin absolu et non un chemin relatif.
Le niveau de log utilisé peut être l'un des suivants : error
, warning
, info
ou debug
. Dans des circonstances normales, utilisez info
. Des options de débogage plus détaillées sont utilisées pour debug
. N'utilisez pas ces options de débogage détaillées pendant une période prolongée. Ils peuvent générer une sortie excessive et le gestionnaire de fichiers log du module de logging est le gestionnaire de fichiers standard et n'effectue aucune rotation de fichiers log .
logarithme de l'erreur standard
Pour certains fournisseurs d'hébergement, il peut ne pas être possible d'utiliser un fichier de log distinct pour l'agent. Configurez le module de logging pour log sur la sortie d'erreur standard. Cette sortie est capturée dans le fichier log d'erreur normal de votre mécanisme d'hébergement.
Pour ce faire dans le fichier de configuration de l’agent :
log_file = stderrlog_level = info
La valeur stdout
peut également être utilisée à la place de stderr
.
enregistrer toutes les données ( log d'audit)
Si vous devez enregistrer et afficher des informations sur les donnéesall transmises entre le processus de monitoring et le collecteur New Relic, vous pouvez activer le logging d'audit pendant de courtes périodes. Cela est utile, par exemple, pour le débogage ou l'audit, lorsque vous avez besoin d'informations détaillées sur ce qui est exactement transmis.
Résoudre les conflits du module log
Si aucun logging n'est capturé, il peut y avoir un conflit avec la manière dont le module de logging Python est initialisé et/ou configuré. Des problèmes peuvent survenir lors de l’utilisation des fonctions suivantes :
Reportez-vous à la documentation de tout framework ou application Web utilisé. Il peut fournir un mécanisme spécialisé pour configurer le module de logging Python. Par exemple, lors de l’utilisation de Django, l’approche du dictionnaire pour la configuration du module de logging Python est prise en charge automatiquement, les définitions étant définies dans l’attribut LOGGING
dans le module de paramètres Django.
Pour plus d'informations, consultez la documentation de configuration du logging Django .
Fichier de logde l'agent de rotation
Lors de l'utilisation de l'option log_file
dans la configuration de l'agent, le gestionnaire de fichiers standard du module de logging est utilisé. Cela n'effectue aucune rotation de fichier de log . La rotation des fichiers logs ne se fait pas automatiquement car nous ne saurons pas quel type de gestionnaire de fichiers log rotatifs vous souhaitez utiliser, de plus les gestionnaires de fichiers log rotatifs standard fournis avec Python ne sont pas nécessairement sûrs pour une configuration multi-processus. Il peut donc être nécessaire de télécharger et d'utiliser l'un des gestionnaires de fichiers log rotatifs tiers ou d'utiliser un système de logging dédié.
Si votre application s'exécute dans un processus unique, vous pouvez utiliser en toute sécurité l'un des gestionnaires RotatingFileHandler
ou TimedRotatingFileHandler
fournis avec le module de logging. Pour l'utiliser uniquement pour la sortie de l'agent Python, incluez au début de votre fichier de script ou module WSGI, mais avant l'importation du module newrelic
, les éléments suivants :
_LOG_FORMAT = ( "%(asctime)s (%(process)d/%(threadName)s)" " %(name)s %(levelname)s - %(message)s")
_logger = logging.getLogger("newrelic")_handler = logging.handlers.TimedRotatingFileHandler( "agent.log", when="midnight", backupCount=7)_formatter = logging.Formatter(_LOG_FORMAT)_handler.setFormatter(_formatter)_logger.addHandler(_handler)_logger.setLevel(logging.INFO)
Ce code accède à l'instance d'enregistreur racine newrelic
, y attache le gestionnaire de fichier de log rotatif et définit le niveau de log pour les messages à envoyer à ce fichier de log. Nous montrons également comment configurer le format du message de log , mais cela est facultatif.
Si le module de logging dans son ensemble est initialisé, toute sortie log sera propagée et enregistrée par tout gestionnaire associé à l'enregistreur racine, y compris éventuellement vers l'erreur standard. Pour éviter les doublons, configurez le gestionnaire log pour l'enregistreur racine.
Le code ci-dessus pourrait également être simplifié en utilisant la fonction logging.fileConfig()
et un fichier de configuration. Pour plus de détails sur l'utilisation d'un fichier configuration consultez la documentation du module de logging Python sur configuration de logging.
Faire pivoter les logs dans une configuration multiprocessus
Les gestionnaires de fichiers log rotatifs fournis dans le module de logging standard ne sont pas entièrement sûrs à utiliser dans une configuration de serveur multi-processus. Les problèmes qui peuvent survenir sont le mélange de messages provenant de plusieurs processus et les tentatives de plusieurs processus d'effectuer une rotation du fichier log en même temps.
Pour un mécanisme de rotation de fichier de log plus robuste, utilisez un gestionnaire log tiers en conjonction avec le module de logging Python .
Une telle implémentation disponible sur PyPi est :
Pour une solution plus complexe, vous pouvez également envisager un service de logging tel que :
Consultez également la liste des autres gestionnaires fournis en standard dans le module de logging Python, car ceux destinés à l'envoi vers un socket ou à la publication vers une URL HTTP peuvent également être des solutions raisonnables dans certaines circonstances.