lorsque vous commencez à développer en javascript, l'une des premières choses que apprenez probablement est comment utiliser dans cet article, allons trier les informations diverses situations, quelle différence entre [recommandation didacticiel vidéo : tutoriel vidéo nodejs< a> ]< p> bien puissiez navigateur utilisez ou mais y a une importante retenir lors l'utilisation node.js. lorsque écrivez suivant node.js un fichier nommé l'exécutez terminal avec bien qu'ils ressemblent, ils sont réalité traités différemment par système. consultez documentation dans partie chaque processus trois valeurs défaut disponibles en bref, cela permet redirections ( maintenant comprenons technologie sous-jacente journalisation, parlons circonstances lesquelles journaux doit être enregistré. il généralement s'agir l'un éléments suivants : p> nous sauterons deux premiers cas concentrerons derniers basés p> il nombreuses raisons pouvez connecter au serveur. demandes permettre d'en extraire tels statistiques, telles nombre d'utilisateurs ont reçu erreur 404 cliquant, si souhaitez coder essayer ce suit, veuillez d'abord créer nouveau répertoire projet. créez exécutez initialiser projet installer utilisez lorsque démarrer accédez http: localhost:3000, constaterez qu'il imprimera dont avons besoin connaissons pas. p> 如果将其更改为 ![终端中输出的 "[object object]" 信息](https: s3.amazonaws.com com....< p> 可以通过编写自己的日志函数只输出我们关心的东西,但是先等等,谈谈我们通常关心的东西。虽然这些信息经常成为我们关注的焦点,但实际上可能还需要其他信息:< p> 既然一切都会被转到 和 code>,那么我们可能会想要不同的日志级别,还有配置和过滤日志的能力。< p> 我们可以通过依赖 我更喜欢 安装 code>:< pino="require('pino');" express-pino-logger< div> 用下面的代码更新你的 code>文件以使用 logger 和中间件:< expresspino="require('express-pino-logger');" level: process.env.log_level 'info' expresslogger="expressPino({" app.use(expresslogger); logger.debug('calling res.send'); logger.info('server div> 在这段代码中,我们创建了一个 的实例 再次运行 重新启动服务器,你会看到一个完全不同的输出,它每一行打印一个 json。再次导航到 localhost:3000 ,你会看到添加了另一行json。< p> 如果你检查这些 json,将看到它包含所有前面所提到的信息,例如时间戳等。你可能还会注意到 语句没有打印出来。那是因为我们必须修改默认日志级别才能看到。当我们创建 实例时,将值设置为 在这之前要先解决一个问题,即现在的输出不适合人类阅读。 让我们用工具 现在所有的日志都被用 运算符输入给 命令,你的输出应该会经过美化,并且还会包含一些关键信息,而且应该是彩色的。如果再次请求 ,你还应该看到 有各种各样的 transports 来美化或转换你的日志。你甚至可以用 这个文档 中还将包含有关轮换日志文件、过滤和把日志写入不同文件等内容的信息。< p> 现在讨论一下怎样有效地为我们的服务器程序编写日志,为什么不对我们的库使用相同的技术呢?< p> 问题是你的库可能希望通过记录日志来进行调试,但是不应该与使用者的程序相混淆。如果需要调试某些内容,使用者应该能够启用日志。默认情况下,你的库应该是静默的,并将是否输出日志的决策权留给用户。< p> 一个很好的例子是 code>。 的底层有很多东西,你可能想在调试自己的程序时偷看它。如果我们查阅 文档,就会注意到你可以在自己的命令之前添加 如果你运行这个命令,将看到许多其他的输出,这些可帮助你调试程序中的问题。< p> 如果你没有启用调试日志记录,则不会看到任何此类日志。这是通过一个称为 让我们通过创建一个名为 这将创建一个带有命名空间 如果用 重新运行我们的服务器,它会打印前面“库”的调试日志。< p> 如果你的库的用户想要将这个调试信息放到他们的 日志中,他们可以用 团队开发的名为 用以下命令安装库:< pino-debug< div> 在我们第一次使用 你现在将用与程序日志相同的格式查看库的调试日志。< p> 本文介绍的最后一个案例是针对 进行日志记录的特殊情况。我的理念是将“逻辑日志”与 的输出 “日志” 分离。对于所有的逻辑日志,你应该用像 这样的库。这样你或其他人就可以重新使用该逻辑,而不受 的特定用例的约束。< p> 当你用 构建 时,可能希望添加一些看上去很漂亮颜色,或者用有视觉吸引力的方式格式化信息。但是,在构建 时,应该记住以下这几种情况。< p> 一种情况是你的 可能会在持续集成(ci)系统的上下文中使用,因此你可能希望删除颜色和花哨的装饰输出。一些 ci 系统设置了一个名为 像 使用 now if you would run this script using cli.js< you'll see colored output. 但是如果你用 你要记住的另一个场景是 是否以终端模式运行,也就是将内容写入终端。如果是这种情况,我们可以使用 你可以通过检查相应流上的 根据 进程的启动方式,这三个流每个流的值可能不同。你可以在 文档的"process i o" 这一部分中详细了解它。< p> 让我们来看看 在终端中运行 code>,你会看到输出的 之后运行相同的内容,但是将输出重定向到一个文件,然后检查内容:< cli.js output.log cat output.log< div> 你会看到这次它打印了 像 code>这样的工具已经为你处理了这种行为,但是在开发 时,你应该始终了解 可能在 模式下运行或重定向输出的情况。它还可以帮助你进一步获得 的体验。例如你可以在终端中以漂亮的方式排列数据,如果 刚开始用 开发时用 记录你的第一行日志确实很快,但是当你将代码投入生产环境时,应该考虑更多关于日志记录的内容。本文纯粹是对各种方式和可用的日志记录解决方案的介绍。我建议你去看一些自己喜欢的开源项目,看看它们是怎样解决日志记录问题的,还有它们所用到的工具。< 如果你知道或找到了我没有提及的工具,或者有什么疑问,请留言。< 原文地址: https: www.twilio.com guide-node-js-logging< p>< blockquote> < span>< p>
console.log< code> pour enregistrer du contenu sur la console. si recherchez déboguer trouverez centaines d'articles de blog et stackoverflow qui diront simplement d'utiliser code>. comme il s'agit d'une pratique très courante, nous utilisons même règles linter comme
no-console< dans notre code garantir qu'aucun message journal inattendu ne soit laissé. mais se passe-t-il si voulons vraiment quelque chose ? <
console.error< node.js, le faire sans confusion. votre bibliothèque vers console utilisateur.
console.log(`let's go!`);< pre>
la théorie d'abord : détails importants node.js< h2>
index.js< code> : >console.log('hello there'); console.error('bye bye');< div>
node index.js< code>, verrez directement sortie deux : p>
console< sorti
stdout<
console .error< utilise
stderr< p>
stream< ce
stdin< les flux utilisés traiter entrées processus. appuyer bouton rediriger sortie. programme. enfin utilisé messages d'erreur. voulez savoir pourquoi existe quand devez l'utiliser, article. p>
>< code>) tuyaux (
|< shell gérer erreurs diagnostic, distinctes réelle alors
>< commande fichier,
2>< fichier. par exemple, suivante transmettra "bonjour"
hello.log< "bye bye"
error.log< >node index.js > hello.log 2> error.log< div>
quand dois-je me connecter ? h2>
journal programme serveur< h2>
user-agent< l'utilisateur. vous également s’est mal passé. p>
express< >npm init -y npm install express< configurons serveur middleware sortons chaque requête. copiez >const express="require('express');" const port="process.env.PORT" || 3000; app="express();" app.use((req, res, next)=">" { console.log('%o', req); next(); }); app.get(' ', (req, res)=">" res.send('hello world'); app.listen(port, ()=">" console.log('server running on port %d', port); });< div>
console.log('%o', req)< ici l'intégralité l'objet.
util.format< sous capot soutenir l'espace réservé
%o< lire leurs p>
console.log('%s', 不打印整个对象,我们就不会获得更多信息。< p>
pm2< 来运行多个node进程< li>
process< 的各个部分并编写一堆 javascript 来获得所有这些,但关于 的好消息是有
npm< 这个生态系统,里面已经有了各种各样的库供我们使用。其中一些是:< p>
pino< li>
winston< li>
roarr< li>
bunyan< code>(请注意,这个已经 2 年没有更新了)< ul>
pino< code>,因为它速度很快。接下来看看怎样使用
pino< 来帮助我们记录日志。同时我们可以用
express-pino-logger< 包来记录请求。< p>
logger< code>,并将其传给 创建一个新的 logger中间件来调用
app.use< code>。另外,我们用
logger.info< 替换了服务器启动时的 code>,并在路由中添加了一个额外的
logger.debug< 来显示不同的日志级别。< p>
process.env.log_level< code>,这意味着我们可以通过它修改值,或接受默认的
info< code>。通过执行
log_level="debug" node code>,就可以调整日志级别。< p>
pino< 遵循一种理念,为了提高性能,你应该通过管道(使用
|< code>)将输出的任何处理移动到一个单独的进程中。这包括使其可读或将其上传到云主机。这些被称为
transports< code>。可以通过查看 文档了解为什么 中的错误不会写入 code>。< p>
pino-pretty< 来查看更易阅读的日志版本。在你的终端中运行:< --save-dev pino-pretty log_level="debug" | . node_modules .bin pino-pretty< div>
debug< code>消息。< p>
pino-colada< 显示 emoji。这些对你的本地开发很有用。在生产中运行服务器之后,你可能希望将日志传输到另一个 transports,再用 或者用像
tee< 这样的命令将它们写入磁盘以便稍后处理。< p>
库的日志< h2>
debug="mylib:randomid" >debug="mylib:randomid" div>
debug< 的包来完成的。它允许我们在“命名空间”下编写日志消息,如果库的用户包含该命名空间或在
debug< 环境变量 中匹配了它的通配符,就会输出这些。要使用 库,首先要安装它:< debug< div>
random-id.js< 的新文件来模拟我们的库,并将以下代码复制到其中:< debug="require('debug');" log="debug('mylib:randomid');" log('library loaded'); function getrandomid() log('computing random id'); outcome="Math.random()" .tostring(36) .substr(2); log('random id is "%s"', outcome); return outcome; } module.exports="{" getrandomid };< div>
mylib:randomid< 的新 记录器,然后将两条消息输出到日志。让我们在前面的 中使用它:< randomid="require('./random-id');" id="randomId.getRandomId();" res.send(`hello world [${id}]`); div>
pino-debug< 的库来正确的格式化这些日志。< p>
debug< code>之前,需要初始化
pino-debug< code>。最简单的方法是在启动 javascript 脚本的命令之前使用 的
-r< 或
--require< 标志来 require 模块。使用如下命令重新运行你的服务器(假设你安装了
pino-colada< code>):< -r pino-debug pino-colada< div>
cli 输出< h2>
ci< 的环境标志。如果你想更安全地检查自己是否在 中,那就是使用像
is-ci< 这样的包去支持一堆 系统。< p>
chalk< 这样的库已经为你检测了ci 并为你删除了颜色。我们来看看它的样子。< p>
npm chalk< 安装 并创建一个名为
cli.js< 的文件。将以下内容复制到其中:< chalk="require('chalk');" console.log('%s hi there', chalk.cyan('info'));< div>
现在如果你用 运行这个脚本,将会看到彩色输出。< p>ci="true" 运行它,你会看到颜色被消除了:< p>
boxen< 之类的东西显示所有漂亮的输出。如果不是,则可能会将输出重定向到文件或用管道传输到某处。< p>
istty< 属性来检查 code>、
stdout< 是否处于终端模式。例如:
process.stdout.istty<
tty< 的意思是 “电传打印机(teletypewriter)”,在这种情况下专门用于终端。< p>
process.stdout.istty< 的值在不同情况下是如何变化的。先更新你的 :< console.log(process.stdout.istty); div>
true< 被着色了。< p>
undefined< 后面跟着一个简单的无色消息,因为 的重定向关闭了它的终端模式。因为 用了
supports-color< code>,它们会在相应的流上检查
istty< 是 ,你可以切换到更容易解析的方式。<
总结< h2>