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

安裝和使用 Winston
要使用 Winston,首先需要安裝它??梢允褂?npm 安裝 Winston:
npm install winston
安裝完成后,在應用程序中引入 Winston:
const winston = require('winston');
現(xiàn)在可以創(chuàng)建一個 Winston 實例,并開始記錄日志。以下是一個示例:
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 實例。指定了日志級別為 info,表示只記錄等級為 info 或更高的日志消息。我們還指定了一個 json 格式化器,以便記錄格式化的 JSON 日志消息。定義了兩個傳輸器,一個將日志消息記錄到控制臺,另一個將錯誤日志消息記錄到名為 error.log 的文件中。
Winston 的日志級別
Winston 支持多個日志級別,可以根據(jù)日志消息的嚴重程度選擇不同的日志級別來記錄。Winston 的日志級別從高到低分別為:
- error:表示發(fā)生了錯誤
- warn:表示警告性的信息
- info:表示常規(guī)信息
- verbose:表示詳細信息
- debug:表示調(diào)試信息
- silly:表示無關緊要的信息
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 支持多個傳輸器,可以將日志消息記錄到不同的目標中,例如控制臺、文件、數(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 的文件中。我們設置日志級別為 info,只記錄等級為 info 或更高的日志消息。
除了輸出到文件中,Winston還支持輸出控制臺、http請求以及流的方式。

我們也可以自定義輸出的方式,比如輸出到郵件、通過接口消息通知等等。
Winston的實踐
在實際使用過程中,我比較喜歡將console.log進行一次封裝。將 console.log 綁定到 logger.info 方法。每次調(diào)用 console.log 時,實際上是在調(diào)用 logger.info 方法。因此,日志消息將通過Winston的Console傳輸器發(fā)送到標準控制臺中和文件中。
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);
如果不在需要日志記錄時,可以直接設置level為off,就可以停止日志的記錄。
接入es
日志輸出和日志格式解決之后,為了方便檢索和更快的排查問題,可以將日志接入es。
下面是接入es后,通過kibana查看的結(jié)果:

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

