Node輸出日志的正確方法示例
背景
每個程序員都喜歡在有問題的代碼中插入一些日志的方法來幫助調(diào)試程序,比如System.out.println或console.log。解決后,就會將這些語句刪除,周而復(fù)始。
但是通過系統(tǒng)日志輸出的日志格式都是這種:
// output
console.log("log"); // log
console.info("message"); // message
console.warn("Warning");// warning
現(xiàn)在想象一下,如果你在后端排查問題時,你有數(shù)百條這樣的信息。這樣的日志不僅很難知道消息級別或消息記錄的日期,而且過濾和排序日志也是一項(xiàng)艱巨的任務(wù)。
我們排查問題時,更期望看到這樣的日志:
{"level":"error","message":"Error message","timestamp":"2022-09-20T11:39:33.953Z"}
{"level":"warn","message":"Warning message","timestamp":"2022-09-20T11:39:33.957Z"}
{"level":"info","message":"Info message","timestamp":"2022-09-20T11:39:33.957Z"}
日志API就是為了解決這個問題而設(shè)計(jì)的。日志API的優(yōu)點(diǎn):
- 可以很容易地取消全部日志記錄,或者僅僅取消某個級別以下的日志,而且可以很容易地再次打開日志開關(guān)。
- 可以很簡單的禁止日志記錄,因此,將這些日志代碼留在程序中的開銷很小。
- 日志記錄可以被定向到不同的處理器,如在控制臺、文件等等。
- 日志記錄器和處理器都可以記錄進(jìn)行過濾,過濾器可以根據(jù)過濾器實(shí)現(xiàn)指定的標(biāo)準(zhǔn)丟棄那些無用的記錄。
- 日志記錄可以采用不同的方式格式化,例如:純文本或JSON。
- 應(yīng)用程序可以使用多個日志記錄器。
- 日志系統(tǒng)的配置由配置文件控制。
在 Node.js 應(yīng)用中進(jìn)行日志記錄是非常重要的,因?yàn)樗梢詭椭覀兏檻?yīng)用程序中的問題和錯誤。接下來介紹 一下Node.js 的日志記錄技術(shù)。
使用 Winston 進(jìn)行日志記錄
Winston是一個流行的、功能豐富的、靈活的Node.js日志庫。它使用的默認(rèn)格式是JSON,但可以配置向多個存儲設(shè)備中發(fā)送日志,目前每周下載量接近1千萬。

安裝和使用 Winston
要使用 Winston,首先需要安裝它??梢允褂?npm 安裝 Winston:
npm install winston
安裝完成后,在應(yīng)用程序中引入 Winston:
const winston = require('winston');
現(xiàn)在可以創(chuàng)建一個 Winston 實(shí)例,并開始記錄日志。以下是一個示例:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.Console(),
new winston.transports.File({
filename: 'error.log', level: 'error'
})
]
});
logger.info('Hello, world!');
在上面的示例中,創(chuàng)建了一個名為 logger 的 Winston 實(shí)例。指定了日志級別為 info,表示只記錄等級為 info 或更高的日志消息。我們還指定了一個 json 格式化器,以便記錄格式化的 JSON 日志消息。定義了兩個傳輸器,一個將日志消息記錄到控制臺,另一個將錯誤日志消息記錄到名為 error.log 的文件中。
Winston 的日志級別
Winston 支持多個日志級別,可以根據(jù)日志消息的嚴(yán)重程度選擇不同的日志級別來記錄。Winston 的日志級別從高到低分別為:
- error:表示發(fā)生了錯誤
- warn:表示警告性的信息
- info:表示常規(guī)信息
- verbose:表示詳細(xì)信息
- debug:表示調(diào)試信息
- silly:表示無關(guān)緊要的信息
Winston 的格式化器
Winston 的格式化器可以幫助我們格式化日志消息,以便更好地組織和分析日志數(shù)據(jù)。Winston 提供了多個內(nèi)置的格式化器,例如 json、simple、prettyPrint 等。我們也可以自定義格式化器,根據(jù)自己的需求來記錄日志數(shù)據(jù)。
以下是一個使用 json 格式化器記錄日志的示例:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [new winston.transports.Console()]
});
logger.info({ message: 'Hello, world!', user: 'Alice' });
Winston 的傳輸器
Winston 支持多個傳輸器,可以將日志消息記錄到不同的目標(biāo)中,例如控制臺、文件、數(shù)據(jù)庫、syslog 等。以下是一個將日志消息記錄到文件中的示例:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.simple(),
transports: [
new winston.transports.File({ filename: 'app.log' })
]
});
logger.info('Hello, world!');
在上面的示例中,我們使用 File 傳輸器將日志消息記錄到名為 app.log 的文件中。我們設(shè)置日志級別為 info,只記錄等級為 info 或更高的日志消息。
除了輸出到文件中,Winston還支持輸出控制臺、http請求以及流的方式。

我們也可以自定義輸出的方式,比如輸出到郵件、通過接口消息通知等等。
Winston的實(shí)踐
在實(shí)際使用過程中,我比較喜歡將console.log進(jìn)行一次封裝。將 console.log 綁定到 logger.info 方法。每次調(diào)用 console.log 時,實(shí)際上是在調(diào)用 logger.info 方法。因此,日志消息將通過Winston的Console傳輸器發(fā)送到標(biāo)準(zhǔn)控制臺中和文件中。
const winston = require('winston');
const logger = winston.createLogger({
transports: [
new winston.transports.Console(),
new winston.transports.File()
]
});
// 將 console.log 綁定到 logger.info 方法
console.log = logger.info.bind(logger);
// 使用 console.log 記錄日志消息
console.log('Hello, Winston!');
console.log('This is a log message.');
// error 也可以綁定到logger上,但是建議輸出file時,指定新的文件名,方便后續(xù)的日志查看。
console.error = logger.error.bind(logger);
如果不在需要日志記錄時,可以直接設(shè)置level為off,就可以停止日志的記錄。
接入es
日志輸出和日志格式解決之后,為了方便檢索和更快的排查問題,可以將日志接入es。
下面是接入es后,通過kibana查看的結(jié)果:

將日志接入 Elasticsearch (ES) 的好處:
- 快速檢索和分析:ES 是一種基于搜索引擎的分布式數(shù)據(jù)存儲和分析引擎,它提供了一種高效的方式來存儲和搜索大量的結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)。通過將日志接入 ES,我們可以使用 ES 強(qiáng)大的搜索和聚合功能來快速檢索和分析日志數(shù)據(jù)。
- 實(shí)時監(jiān)控:ES 支持實(shí)時數(shù)據(jù)索引和搜索,因此可以實(shí)時監(jiān)控應(yīng)用程序和系統(tǒng)的狀態(tài)和性能。通過將日志接入 ES,我們可以實(shí)時監(jiān)控應(yīng)用程序和系統(tǒng)的日志,并在出現(xiàn)異?;蝈e誤時立即采取行動。
- 可視化和報(bào)告:ES 提供了一種靈活和強(qiáng)大的可視化和報(bào)告工具,可以將日志數(shù)據(jù)可視化為圖表、儀表板和報(bào)告等形式。通過將日志接入 ES,我們可以使用這些工具來生成可視化報(bào)告,并幫助我們更好地理解和優(yōu)化應(yīng)用程序和系統(tǒng)的性能。
注意事項(xiàng)
- 日志級別,不要都使用info來使用,要區(qū)分不同的日志級別。
- 日志的打印方式:同步和異步。
- 日志體量的大小:LOG系統(tǒng)就是直接寫磁盤文件,既然寫磁盤文件就牽扯到磁盤IO,而磁盤IO跟內(nèi)存讀寫有一個數(shù)量級的性能差別。
以上就是Node輸出日志的正確方法示例的詳細(xì)內(nèi)容,更多關(guān)于Node輸出日志的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
windows離線環(huán)境安裝node-sass全過程
文章介紹了如何在Windows系統(tǒng)上安裝和配置node-sass,并提供了一個詳細(xì)的步驟指南,首先,通過命令行查看支持版本;然后,下載對應(yīng)版本的node-sass安裝包;接著,在npm配置文件中增加SASS_BINARY_PATH路徑配置;最后,執(zhí)行npmi命令完成安裝2024-12-12
nodejs實(shí)現(xiàn)獲取當(dāng)前url地址及url各種參數(shù)值
這篇文章主要介紹了nodejs實(shí)現(xiàn)獲取當(dāng)前url地址及url各種參數(shù)值,本文直接給出代碼實(shí)例,需要的朋友可以參考下2015-06-06
Windows上安裝Node-RED的實(shí)現(xiàn)
Node-RED是一個用于物聯(lián)網(wǎng)編程的工具,提供了一個基于瀏覽器的編程環(huán)境和豐富的節(jié)點(diǎn)類型,本文就來介紹一下Windows上安裝Node-RED的實(shí)現(xiàn),感興趣的可以了解一下2025-02-02
node實(shí)現(xiàn)批量上傳本地圖片轉(zhuǎn)為圖片CDN的項(xiàng)目實(shí)踐
本文主要介紹了node實(shí)現(xiàn)批量上傳本地圖片轉(zhuǎn)為圖片CDN的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
nodejs提示:cross-device link not permitted, rename錯誤的解決方法
這篇文章主要給大家介紹了關(guān)于nodejs提示:cross-device link not permitted, rename錯誤的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用nodejs具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
nodejs配置express服務(wù)器運(yùn)行自動打開瀏覽器詳細(xì)步驟
在nodejs中使用express來搭建框架可以說是非常的簡單方便,下面這篇文章主要給大家介紹了關(guān)于nodejs配置express服務(wù)器運(yùn)行自動打開瀏覽器的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01

