Table des matières
1. Principe et pratique
Maison interface Web js tutoriel Apprenez étape par étape à imprimer avec élégance les journaux de liens complets dans le nœud

Apprenez étape par étape à imprimer avec élégance les journaux de liens complets dans le nœud

Mar 07, 2022 pm 08:05 PM
node

Comment le nœud peut-il imprimer les journaux de liens complets avec élégance ? L'article suivant vous présentera comment imprimer avec élégance des journaux de liens complets dans node. J'espère qu'il vous sera utile !

Apprenez étape par étape à imprimer avec élégance les journaux de liens complets dans le nœud

Lorsqu'un utilisateur signale un problème : lorsqu'une erreur se produit lors de l'utilisation d'une certaine fonction en ligne, comment pouvez-vous la localiser rapidement et précisément ? Comment suivre efficacement l'optimisation lorsqu'une certaine interface de requête renvoie les données lentement ?

1. Principe et pratique

Comme nous le savons tous, lorsqu'une demande arrive, les journaux suivants seront probablement générés :

1. AceesLog : journal d'accès utilisateur

2. . SQL : journal des requêtes SQL

4. ThirdParty : journal des services tiers

Comment suivre tous les logs générés par une requête ?

L'approche générale consiste à utiliser un requestId comme identifiant unique,

puis à écrire un middleware, à injecter le requestId dans le contexte, et lorsque la journalisation est nécessaire, à le sortir du contexte et à l'imprimer,

Dans un tiers services et SQL Dans le journal, le requestId doit également être transmis à la fonction correspondante pour l'impression. Il est trop gênant de le transmettre couche par couche, et le code est également relativement intrusif.

Notre objectif est de réduire le caractère intrusif du code, de l'injecter une seule fois et de le suivre automatiquement.

Après la recherche, async_hooks peut suivre le cycle de vie du comportement asynchrone. Dans chaque ressource asynchrone (chaque requête est une ressource asynchrone), elle a 2 ID,

sont respectivement asyncId (l'ID du cycle de vie actuel de la ressource asynchrone) ) , trigerAsyncId (ID de ressource asynchrone parent).

async_hooks fournit les hooks de cycle de vie suivants pour surveiller les ressources asynchrones :

asyncHook = async_hook.createHook({
  // 监听异步资源的创建
  init(asyncId,type,triggerAsyncId,resource){},
  // 异步资源回调函数开始执行之前
  before(asyncId){},
  // 异步资源回调函数开始执行后
  after(asyncId){},
  // 监听异步资源的销毁
  destroy(asyncId){}
})
Copier après la connexion

Ensuite, si nous effectuons un mappage, chaque asyncId est mappé à un stockage et le requestId correspondant est stocké dans le stockage, alors le requestId peut être facilement obtenu.

Il se trouve que la bibliothèque cls-hooked a été encapsulée sur la base de async_hooks. Elle conserve une copie des données dans la même ressource asynchrone et la stocke sous la forme de paires clé-valeur. (Remarque : async_hooked doit être utilisé dans la version supérieure node>=8.2.1) Bien sûr, il existe d'autres implémentations dans la communauté, telles que cls-session, node-continuation-local-storage, etc.

Ce qui suit est un exemple de la façon dont j'ai appliqué cls-hooked dans mon projet :

/session.js crée un espace de stockage nommé

const createNamespace = require('cls-hooked').createNamespace 
const session = createNamespace('requestId-store') 
module.exports = session
Copier après la connexion

/logger.js imprime le journal

const session = require('./session') 
module.exports = { 
info: (message) => 
{ 
const requestId = session.get('requestId')
console.log(`requestId:${requestId}`, message) 
}, 
error: (message) => 
{ 
const requestId = session.get('requestId') 
console.error(`requestId:${requestId}`, message) 
} 
}
Copier après la connexion

/sequelize.js sql appelle l'enregistreur pour imprimer le journal

const logger = require("./logger") 
new Sequelize( 
logging: function (sql, costtime) { 
logger.error( `sql exe : ${sql} | costtime ${costtime} ms` ); 
} )
Copier après la connexion

/app.js Définissez le requestId, définissez le requestId pour renvoyer l'en-tête de réponse et imprimez le journal d'accès

const session = require('./session') 
const logger = require('./logger') 
async function accessHandler(ctx, next) 
{ 
const requestId = ctx.header['x-request-id'] || uuid()
const params = ctx.request.body ? JSON.stringify(ctx.request.body) : JSON.stringify(ctx.request.query)
// 设置requestId session.run(() => { session.set('requestId', requestId)
logger.info(`url:${ctx.request.path};params:${params}`) next()
// 设置返回响应头
ctx.res.setHeader('X-Request-Id',requestId)
}) }
Copier après la connexion

Jetons un œil au journal lorsqu'un chemin de requête est /home?a=1 :

访问日志:
requestId:79f422a6-6151-4bfd-93ca-3c6f892fb9ac url:/home;params:{"a":"1"}

Sql日志:
requestId:79f422a6-6151-4bfd-93ca-3c6f892fb9ac sql exe :
Executed (default): SELECT `id` FROM t_user
Copier après la connexion

Vous pouvez voir l'intégralité de la requête. Le journal requestId du lien est le même. Si une alarme est envoyée ultérieurement à la plateforme d'alarme, nous pouvons alors trouver l'intégralité du lien exécuté par cette requête en fonction du requestId.

Les étudiants prudents remarqueront peut-être que j'ai également défini le requestId dans l'en-tête de réponse renvoyé par l'interface. Le but est de connaître le requestId directement depuis le navigateur si une requête tarde à répondre ou présente des problèmes d'analyse.

2. Surcharge de performances

J'ai fait un test de stress localement,

Voici la comparaison de l'utilisation de la mémoire :

Apprenez étape par étape à imprimer avec élégance les journaux de liens complets dans le nœudC'est environ 10 % de plus que si async_hook n'est pas utilisé.

Pour notre système QPS qui est de niveau 100, ce n'est pas grave, mais s'il s'agit d'un service à haute concurrence, nous devrons peut-être y réfléchir attentivement.

ps : S'il y a des erreurs, veuillez les signaler, ne commentez pas si vous ne les aimez pas

Pour plus de connaissances sur les nœuds, veuillez visiter :

tutoriel nodejs

 !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser Express pour gérer le téléchargement de fichiers dans un projet de nœud Comment utiliser Express pour gérer le téléchargement de fichiers dans un projet de nœud Mar 28, 2023 pm 07:28 PM

Comment gérer le téléchargement de fichiers ? L'article suivant vous expliquera comment utiliser Express pour gérer les téléchargements de fichiers dans le projet de nœud. J'espère qu'il vous sera utile !

Comment supprimer un nœud dans NVM Comment supprimer un nœud dans NVM Dec 29, 2022 am 10:07 AM

Comment supprimer un nœud avec nvm : 1. Téléchargez « nvm-setup.zip » et installez-le sur le lecteur C ; 2. Configurez les variables d'environnement et vérifiez le numéro de version via la commande « nvm -v » 3. Utilisez la commande « nvm » ; install" commande Installer le nœud ; 4. Supprimez le nœud installé via la commande "nvm uninstall".

Comment faire la mise en miroir Docker du service Node ? Explication détaillée de l'optimisation extrême Comment faire la mise en miroir Docker du service Node ? Explication détaillée de l'optimisation extrême Oct 19, 2022 pm 07:38 PM

Durant cette période, je développais un service HTML dynamique commun à toutes les catégories de documents Tencent. Afin de faciliter la génération et le déploiement des accès aux différentes catégories, et pour suivre la tendance de migration vers le cloud, j'ai envisagé d'utiliser Docker pour corriger. contenu du service et gérer les versions des produits de manière unifiée. Cet article partagera l'expérience d'optimisation que j'ai accumulée en train de servir Docker pour votre référence.

Une analyse approfondie de l'outil de gestion de processus de Node « pm2 » Une analyse approfondie de l'outil de gestion de processus de Node « pm2 » Apr 03, 2023 pm 06:02 PM

Cet article partagera avec vous l'outil de gestion de processus de Node "pm2" et expliquera pourquoi pm2 est nécessaire, comment installer et utiliser pm2, j'espère qu'il sera utile à tout le monde !

Enseignement du nœud PI: Qu'est-ce qu'un nœud PI? Comment installer et configurer le nœud PI? Enseignement du nœud PI: Qu'est-ce qu'un nœud PI? Comment installer et configurer le nœud PI? Mar 05, 2025 pm 05:57 PM

Explication détaillée et guide d'installation pour les nœuds de pignon Cet article introduira l'écosystème de pignon en détail - nœuds PI, un rôle clé dans l'écosystème de pignon et fournir des étapes complètes pour l'installation et la configuration. Après le lancement du réseau de test de la blockchain pèse, les nœuds PI sont devenus une partie importante de nombreux pionniers participant activement aux tests, se préparant à la prochaine version du réseau principal. Si vous ne connaissez pas encore Pinetwork, veuillez vous référer à ce qu'est Picoin? Quel est le prix de l'inscription? PI Utilisation, exploitation minière et sécurité. Qu'est-ce que Pinetwork? Le projet Pinetwork a commencé en 2019 et possède sa pièce exclusive de crypto-monnaie PI. Le projet vise à en créer un que tout le monde peut participer

Parlons de la façon d'utiliser pkg pour empaqueter des projets Node.js dans des fichiers exécutables. Parlons de la façon d'utiliser pkg pour empaqueter des projets Node.js dans des fichiers exécutables. Dec 02, 2022 pm 09:06 PM

Comment empaqueter le fichier exécutable nodejs avec pkg ? L'article suivant vous expliquera comment utiliser pkg pour empaqueter un projet Node dans un fichier exécutable. J'espère qu'il vous sera utile !

Que faire si le nœud npm gyp échoue Que faire si le nœud npm gyp échoue Dec 29, 2022 pm 02:42 PM

npm node gyp a échoué car les versions de « node-gyp.js » et « Node.js » ne correspondaient pas. La solution : 1. Videz le cache du nœud via « npm cache clean -f » 2. Via « npm install - ». g n" Installez le module n ; 3. Installez la version "node v12.21.0" via la commande "n v12.21.0".

Authentification basée sur des jetons avec Angular et Node Authentification basée sur des jetons avec Angular et Node Sep 01, 2023 pm 02:01 PM

L'authentification est l'une des parties les plus importantes de toute application Web. Ce didacticiel traite des systèmes d'authentification basés sur des jetons et de leurs différences par rapport aux systèmes de connexion traditionnels. À la fin de ce didacticiel, vous verrez une démo entièrement fonctionnelle écrite en Angular et Node.js. Systèmes d'authentification traditionnels Avant de passer aux systèmes d'authentification basés sur des jetons, examinons les systèmes d'authentification traditionnels. L'utilisateur fournit son nom d'utilisateur et son mot de passe dans le formulaire de connexion et clique sur Connexion. Après avoir effectué la demande, authentifiez l'utilisateur sur le backend en interrogeant la base de données. Si la demande est valide, une session est créée à l'aide des informations utilisateur obtenues à partir de la base de données et les informations de session sont renvoyées dans l'en-tête de réponse afin que l'ID de session soit stocké dans le navigateur. Donne accès aux applications soumises à

See all articles