真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Node.js中日志信息的案例分析-創(chuàng)新互聯(lián)

Node.js中日志信息的案例分析?這個(gè)問(wèn)題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見(jiàn)到的。希望通過(guò)這個(gè)問(wèn)題能讓你收獲頗深。下面是小編給大家?guī)?lái)的參考內(nèi)容,讓我們一起來(lái)看看吧!

創(chuàng)新互聯(lián)公司專注于成縣網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供成縣營(yíng)銷型網(wǎng)站建設(shè),成縣網(wǎng)站制作、成縣網(wǎng)頁(yè)設(shè)計(jì)、成縣網(wǎng)站官網(wǎng)定制、微信小程序開(kāi)發(fā)服務(wù),打造成縣網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供成縣網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

當(dāng)你開(kāi)始用 JavaScript 進(jìn)行開(kāi)發(fā)時(shí),可能學(xué)到的第一件事就是如何用 console.log 將內(nèi)容記錄到控制臺(tái)。如果你去搜索如何調(diào)試 JavaScript,會(huì)發(fā)現(xiàn)數(shù)百篇博文和 StackOverflow 文章都會(huì)簡(jiǎn)單的告訴你用 console.log。因?yàn)檫@是一種很常見(jiàn)的做法,我們甚至?xí)诖a中使用像 no-console 這樣的 linter 規(guī)則來(lái)確保不會(huì)留下意外的日志信息。但是如果我們真的想要去記錄某些內(nèi)容呢?

在本文中,我們將梳理各種情況下要記錄的日志信息,Node.js 中 console.logconsole.error之間的區(qū)別是什么,以及如何在不發(fā)生混亂的情況下把你庫(kù)中的日志記錄輸出到用戶控制臺(tái)。

console.log(`Let's go!`);

理論先行:Node.js 的重要細(xì)節(jié)

雖然你可以在瀏覽器和 Node.js 中使用 console.logconsole.error,但在使用 Node.js 時(shí)要記住一件重要的事。當(dāng)你在 Node.js 中將以下代碼寫入名為 index.js 的文件中時(shí):

console.log('Hello there');
console.error('Bye bye');

并用 node index.js 在終端中執(zhí)行它,你會(huì)直接看到兩者的輸出:

Node.js中日志信息的案例分析

雖然它們看起來(lái)可能一樣,但實(shí)際上系統(tǒng)對(duì)它們的處理方式是不同的。如果你查閱 Node.js 文檔的 console部分,會(huì)看到 console.log 是輸出到 stdoutconsole .error 用的是 stderr。

每個(gè)進(jìn)程都有三個(gè)可用的默認(rèn) stream。那些是 stdin,stdoutstderrstdin 流用來(lái)在處理進(jìn)程的輸入。例如按下按鈕或重定向輸出。 stdout 流用于程序的輸出。最后 stderr 用于錯(cuò)誤消息。如果你想了解為什么會(huì)有 stderr 存在,以及應(yīng)該在什么時(shí)候使用它,可以查看這篇文章。

簡(jiǎn)而言之,這允許我們?cè)?shell 中使用重定向(>)和管道(|)來(lái)處理錯(cuò)誤和診斷信息,它們是與程序的實(shí)際輸出結(jié)果是分開(kāi)的。雖然 > 允許我們將命令的輸出重定向到文件中,但是 2> 允許我們將 stderr 的輸出重定向到文件中。例如,下面這個(gè)命令會(huì)將 “Hello there” 傳給一個(gè)名為 hello.log 的文件并把 “Bye bye” 傳到一個(gè)名為 error.log 的文件中。

node index.js > hello.log 2> error.log

Node.js中日志信息的案例分析

應(yīng)該在什么時(shí)候記錄日志?

現(xiàn)在我們已經(jīng)了解了日志記錄的底層技術(shù),接下來(lái)讓我們談?wù)剳?yīng)該在什么情況下記錄日志內(nèi)容。通常應(yīng)該是以下情況之一:

  • 在開(kāi)發(fā)過(guò)程中快速調(diào)試意外行為
  • 基于瀏覽器的分析或診斷日志記錄
  • 記錄你服務(wù)器上傳入的請(qǐng)求,以及所有可能發(fā)生的故障
  • 使用庫(kù)的日志調(diào)試選項(xiàng)來(lái)幫助用戶解決問(wèn)題
  • 在 CLI 輸出進(jìn)度、確認(rèn)消息或錯(cuò)誤信息

我們將跳過(guò)前兩種情況,并重點(diǎn)介紹基于 Node.js 的后三點(diǎn)。

服務(wù)器程序日志

可能你在服務(wù)器上記錄日志的原因有多種。例如記錄傳入的請(qǐng)求并允許你從中提取諸如統(tǒng)計(jì)信息之類的內(nèi)容,比如有多少用戶在點(diǎn)擊時(shí)發(fā)生了 404 錯(cuò)誤,或者用戶瀏覽器的 User-Agent。你也想知道在什么時(shí)候因?yàn)槭裁闯鲥e(cuò)了。

如果你想編碼嘗試下面的內(nèi)容,請(qǐng)先創(chuàng)建一個(gè)新的項(xiàng)目目錄。在目錄中創(chuàng)建一個(gè) index.js 并運(yùn)行以下命令來(lái)初始化項(xiàng)目并安裝 express

npm init -y
npm install express

讓我們?cè)O(shè)置一個(gè)帶有中間件的服務(wù)器,每個(gè)請(qǐng)求只需用 console.log進(jìn)行輸出。將以下內(nèi)容復(fù)制到 index.js 文件中:

const express = require('express');

const PORT = process.env.PORT || 3000;
const 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);
});

在這里用  console.log('%O', req)  來(lái)記錄整個(gè)對(duì)象的信息。 console.log 在底層使用了 util.format 來(lái)支持 %O 占位符。你可以在 Node.js 文檔中查閱它們的細(xì)節(jié)。

當(dāng)你運(yùn)行 node index.js 來(lái)啟動(dòng)你的服務(wù)器并導(dǎo)航到 http://localhost:3000 時(shí),會(huì)發(fā)現(xiàn)它會(huì)打印出很多我們確實(shí)需要但不知道的信息。

Node.js中日志信息的案例分析

如果將其更改為  console.log('%s', req)  不打印整個(gè)對(duì)象,我們就不會(huì)獲得更多信息。

![終端中輸出的 "[object Object]" 信息](https://s3.amazonaws.com/com....

可以通過(guò)編寫自己的日志函數(shù)只輸出我們關(guān)心的東西,但是先等等,談?wù)勎覀兺ǔjP(guān)心的東西。雖然這些信息經(jīng)常成為我們關(guān)注的焦點(diǎn),但實(shí)際上可能還需要其他信息:

  • 時(shí)間戳 - 知道事情何時(shí)發(fā)生
  • 計(jì)算機(jī)/服務(wù)器名稱 - 如果你運(yùn)行的是分布式系統(tǒng)
  • 進(jìn)程ID  - 如果你用了 pm2 來(lái)運(yùn)行多個(gè)Node進(jìn)程
  • 消息 - 包含某些內(nèi)容的實(shí)際消息
  • 可能會(huì)需要的其它變量或信息

既然一切都會(huì)被轉(zhuǎn)到 stdoutstderr,那么我們可能會(huì)想要不同的日志級(jí)別,還有配置和過(guò)濾日志的能力。

我們可以通過(guò)依賴 process 的各個(gè)部分并編寫一堆 JavaScript 來(lái)獲得所有這些,但關(guān)于 Node.js 的好消息是有 npm 這個(gè)生態(tài)系統(tǒng),里面已經(jīng)有了各種各樣的庫(kù)供我們使用。其中一些是:

  • pino    
  • winston    
  • roarr    
  • bunyan(請(qǐng)注意,這個(gè)已經(jīng) 2 年沒(méi)有更新了)

我更喜歡pino,因?yàn)樗俣群芸?。接下?lái)看看怎樣使用 pino 來(lái)幫助我們記錄日志。同時(shí)我們可以用 express-pino-logger 包來(lái)記錄請(qǐng)求。

安裝 pinoexpress-pino-logger

npm install pino express-pino-logger

用下面的代碼更新你的 index.js文件以使用 logger 和中間件:

const express = require('express');
const pino = require('pino');
const expressPino = require('express-pino-logger');

const logger = pino({ level: process.env.LOG_LEVEL || 'info' });
const expressLogger = expressPino({ logger });

const PORT = process.env.PORT || 3000;
const app = express();

app.use(expressLogger);

app.get('/', (req, res) => {
 logger.debug('Calling res.send');
 res.send('Hello World');
});

app.listen(PORT, () => {
 logger.info('Server running on port %d', PORT);
});

在這段代碼中,我們創(chuàng)建了一個(gè) pino 的實(shí)例 logger,并將其傳給 express-pino-logger 創(chuàng)建一個(gè)新的 logger中間件來(lái)調(diào)用 app.use。另外,我們用 logger.info 替換了服務(wù)器啟動(dòng)時(shí)的 console.log,并在路由中添加了一個(gè)額外的 logger.debug 來(lái)顯示不同的日志級(jí)別。

再次運(yùn)行 node index.js 重新啟動(dòng)服務(wù)器,你會(huì)看到一個(gè)完全不同的輸出,它每一行打印一個(gè) JSON。再次導(dǎo)航到 http://localhost:3000 ,你會(huì)看到添加了另一行JSON。

Node.js中日志信息的案例分析

如果你檢查這些 JSON,將看到它包含所有前面所提到的信息,例如時(shí)間戳等。你可能還會(huì)注意到 logger.debug 語(yǔ)句沒(méi)有打印出來(lái)。那是因?yàn)槲覀儽仨毿薷哪J(rèn)日志級(jí)別才能看到。當(dāng)我們創(chuàng)建 logger 實(shí)例時(shí),將值設(shè)置為 process.env.LOG_LEVEL,這意味著我們可以通過(guò)它修改值,或接受默認(rèn)的 info。通過(guò)執(zhí)行 LOG_LEVEL = debug node index.js,就可以調(diào)整日志級(jí)別。

在這之前要先解決一個(gè)問(wèn)題,即現(xiàn)在的輸出不適合人類閱讀。pino 遵循一種理念,為了提高性能,你應(yīng)該通過(guò)管道(使用 |)將輸出的任何處理移動(dòng)到一個(gè)單獨(dú)的進(jìn)程中。這包括使其可讀或?qū)⑵渖蟼鞯皆浦鳈C(jī)。這些被稱為 transports??梢酝ㄟ^(guò)查看 transports 文檔了解為什么 pino 中的錯(cuò)誤不會(huì)寫入 stderr。

讓我們用工具 pino-pretty 來(lái)查看更易閱讀的日志版本。在你的終端中運(yùn)行:

npm install --save-dev pino-pretty
LOG_LEVEL=debug node index.js | ./node_modules/.bin/pino-pretty

現(xiàn)在所有的日志都被用 | 運(yùn)算符輸入給 pino-pretty 命令,你的輸出應(yīng)該會(huì)經(jīng)過(guò)美化,并且還會(huì)包含一些關(guān)鍵信息,而且應(yīng)該是彩色的。如果再次請(qǐng)求 http://localhost:3000 ,你還應(yīng)該看到debug消息。

Node.js中日志信息的案例分析

有各種各樣的 transports 來(lái)美化或轉(zhuǎn)換你的日志。你甚至可以用 pino-colada 顯示 emoji。這些對(duì)你的本地開(kāi)發(fā)很有用。在生產(chǎn)中運(yùn)行服務(wù)器之后,你可能希望將日志傳輸?shù)搅硪粋€(gè) transports,再用 > 或者用像 tee) 這樣的命令將它們寫入磁盤以便稍后處理。

這個(gè)文檔 中還將包含有關(guān)輪換日志文件、過(guò)濾和把日志寫入不同文件等內(nèi)容的信息。

庫(kù)的日志

現(xiàn)在討論一下怎樣有效地為我們的服務(wù)器程序編寫日志,為什么不對(duì)我們的庫(kù)使用相同的技術(shù)呢?

問(wèn)題是你的庫(kù)可能希望通過(guò)記錄日志來(lái)進(jìn)行調(diào)試,但是不應(yīng)該與使用者的程序相混淆。如果需要調(diào)試某些內(nèi)容,使用者應(yīng)該能夠啟用日志。默認(rèn)情況下,你的庫(kù)應(yīng)該是靜默的,并將是否輸出日志的決策權(quán)留給用戶。

一個(gè)很好的例子是 express。 express  的底層有很多東西,你可能想在調(diào)試自己的程序時(shí)偷看它。如果我們查閱 express 文檔,就會(huì)注意到你可以在自己的命令之前添加 DEBUG=express:*,如下所示:

DEBUG=express:* node index.js

如果你運(yùn)行這個(gè)命令,將看到許多其他的輸出,這些可幫助你調(diào)試程序中的問(wèn)題。

Node.js中日志信息的案例分析

如果你沒(méi)有啟用調(diào)試日志記錄,則不會(huì)看到任何此類日志。這是通過(guò)一個(gè)稱為 debug 的包來(lái)完成的。它允許我們?cè)凇懊臻g”下編寫日志消息,如果庫(kù)的用戶包含該命名空間或在 DEBUG 環(huán)境變量 中匹配了它的通配符,就會(huì)輸出這些。要使用 debug 庫(kù),首先要安裝它:

npm install debug

讓我們通過(guò)創(chuàng)建一個(gè)名為 random-id.js 的新文件來(lái)模擬我們的庫(kù),并將以下代碼復(fù)制到其中:

const debug = require('debug');

const log = debug('mylib:randomid');

log('Library loaded');

function getRandomId() {
 log('Computing random ID');
 const outcome = Math.random()
   .toString(36)
   .substr(2);
 log('Random ID is "%s"', outcome);
 return outcome;
}

module.exports = { getRandomId };

這將創(chuàng)建一個(gè)帶有命名空間 mylib:randomid 的新 debug 記錄器,然后將兩條消息輸出到日志。讓我們?cè)谇懊娴?index.js 中使用它:

const express = require('express');
const pino = require('pino');
const expressPino = require('express-pino-logger');

const randomId = require('./random-id');

const logger = pino({ level: process.env.LOG_LEVEL || 'info' });
const expressLogger = expressPino({ logger });

const PORT = process.env.PORT || 3000;
const app = express();

app.use(expressLogger);

app.get('/', (req, res) => {
 logger.debug('Calling res.send');
 const id = randomId.getRandomId();
 res.send(`Hello World [${id}]`);
});

app.listen(PORT, () => {
 logger.info('Server running on port %d', PORT);
});

如果用 DEBUG=mylib:randomid node index.js 重新運(yùn)行我們的服務(wù)器,它會(huì)打印前面“庫(kù)”的調(diào)試日志。

Node.js中日志信息的案例分析

如果你的庫(kù)的用戶想要將這個(gè)調(diào)試信息放到他們的 pino 日志中,他們可以用 pino 團(tuán)隊(duì)開(kāi)發(fā)的名為 pino-debug 的庫(kù)來(lái)正確的格式化這些日志。

用以下命令安裝庫(kù):

npm install pino-debug

在我們第一次使用debug之前,需要初始化pino-debug。最簡(jiǎn)單的方法是在啟動(dòng) javascript 腳本的命令之前使用 Node.js 的 -r--require 標(biāo)志來(lái) require 模塊。使用如下命令重新運(yùn)行你的服務(wù)器(假設(shè)你安裝了pino-colada):

DEBUG=mylib:randomid node -r pino-debug index.js | ./node_modules/.bin/pino-colada

你現(xiàn)在將用與程序日志相同的格式查看庫(kù)的調(diào)試日志。

Node.js中日志信息的案例分析

CLI 輸出

本文介紹的最后一個(gè)案例是針對(duì) CLI 進(jìn)行日志記錄的特殊情況。我的理念是將“邏輯日志”與 CLI 的輸出 “日志” 分離。對(duì)于所有的邏輯日志,你應(yīng)該用像 debug 這樣的庫(kù)。這樣你或其他人就可以重新使用該邏輯,而不受 CLI 的特定用例的約束。

當(dāng)你用 Node.js 構(gòu)建 CLI 時(shí),可能希望添加一些看上去很漂亮顏色,或者用有視覺(jué)吸引力的方式格式化信息。但是,在構(gòu)建 CLI 時(shí),應(yīng)該記住以下這幾種情況。

一種情況是你的 CLI 可能會(huì)在持續(xù)集成(CI)系統(tǒng)的上下文中使用,因此你可能希望刪除顏色和花哨的裝飾輸出。一些 CI 系統(tǒng)設(shè)置了一個(gè)名為 CI 的環(huán)境標(biāo)志。如果你想更安全地檢查自己是否在 CI 中,那就是使用像 is-ci 這樣的包去支持一堆 CI 系統(tǒng)。

chalk 這樣的庫(kù)已經(jīng)為你檢測(cè)了CI 并為你刪除了顏色。我們來(lái)看看它的樣子。

使用 npm install chalk 安裝 chalk 并創(chuàng)建一個(gè)名為 cli.js 的文件。將以下內(nèi)容復(fù)制到其中:

const chalk = require('chalk');

console.log('%s Hi there', chalk.cyan('INFO'));

Now if you would run this script using node cli.js you'll see colored output.
現(xiàn)在如果你用 node cli.js 運(yùn)行這個(gè)腳本,將會(huì)看到彩色輸出。

Node.js中日志信息的案例分析

但是如果你用 CI=true node cli.js 運(yùn)行它,你會(huì)看到顏色被消除了:

Node.js中日志信息的案例分析

你要記住的另一個(gè)場(chǎng)景是 stdout 是否以終端模式運(yùn)行,也就是將內(nèi)容寫入終端。如果是這種情況,我們可以使用 boxen 之類的東西顯示所有漂亮的輸出。如果不是,則可能會(huì)將輸出重定向到文件或用管道傳輸?shù)侥程帯?/p>

你可以通過(guò)檢查相應(yīng)流上的 isTTY 屬性來(lái)檢查 stdin、stdoutstderr 是否處于終端模式。例如:process.stdout.isTTYTTY 的意思是 “電傳打印機(jī)(teletypewriter)”,在這種情況下專門用于終端。

根據(jù) Node.js 進(jìn)程的啟動(dòng)方式,這三個(gè)流每個(gè)流的值可能不同。你可以在 Node.js 文檔的"process I/O" 這一部分中詳細(xì)了解它。

讓我們來(lái)看看 process.stdout.isTTY 的值在不同情況下是如何變化的。先更新你的 cli.js

const chalk = require('chalk');

console.log(process.stdout.isTTY);
console.log('%s Hi there', chalk.cyan('INFO'));

在終端中運(yùn)行 node cli.js,你會(huì)看到輸出的 true 被著色了。

Node.js中日志信息的案例分析

之后運(yùn)行相同的內(nèi)容,但是將輸出重定向到一個(gè)文件,然后檢查內(nèi)容:

node cli.js > output.log
cat output.log

你會(huì)看到這次它打印了 undefined 后面跟著一個(gè)簡(jiǎn)單的無(wú)色消息,因?yàn)?stdout 的重定向關(guān)閉了它的終端模式。因?yàn)?chalk 用了  supports-color,它們會(huì)在相應(yīng)的流上檢查 isTTY。

Node.js中日志信息的案例分析

chalk這樣的工具已經(jīng)為你處理了這種行為,但是在開(kāi)發(fā) CLI 時(shí),你應(yīng)該始終了解 CLI 可能在 CI 模式下運(yùn)行或重定向輸出的情況。它還可以幫助你進(jìn)一步獲得 CLI 的體驗(yàn)。例如你可以在終端中以漂亮的方式排列數(shù)據(jù),如果isTTYundefined ,你可以切換到更容易解析的方式。

剛開(kāi)始用 JavaScript 開(kāi)發(fā)時(shí)用 console.log 記錄你的第一行日志確實(shí)很快,但是當(dāng)你將代碼投入生產(chǎn)環(huán)境時(shí),應(yīng)該考慮更多關(guān)于日志記錄的內(nèi)容。本文純粹是對(duì)各種方式和可用的日志記錄解決方案的介紹。我建議你去看一些自己喜歡的開(kāi)源項(xiàng)目,看看它們是怎樣解決日志記錄問(wèn)題的,還有它們所用到的工具。

Node.js中日志信息的案例分析

感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)Node.js中日志信息的案例分析大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。


本文題目:Node.js中日志信息的案例分析-創(chuàng)新互聯(lián)
本文來(lái)源:http://weahome.cn/article/dchijj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部