Node輸出日志的正確方法示例
背景
每個程序員都喜歡在有問題的代碼中插入一些日志的方法來幫助調試程序,比如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:表示調試信息
- silly:表示無關緊要的信息
Winston 的格式化器
Winston 的格式化器可以幫助我們格式化日志消息,以便更好地組織和分析日志數(shù)據(jù)。Winston 提供了多個內置的格式化器,例如 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 方法。每次調用 console.log 時,實際上是在調用 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查看的結果:
將日志接入 Elasticsearch (ES) 的好處:
- 快速檢索和分析:ES 是一種基于搜索引擎的分布式數(shù)據(jù)存儲和分析引擎,它提供了一種高效的方式來存儲和搜索大量的結構化和非結構化數(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跟內存讀寫有一個數(shù)量級的性能差別。
以上就是Node輸出日志的正確方法示例的詳細內容,更多關于Node輸出日志的資料請關注腳本之家其它相關文章!
相關文章
node.js實現(xiàn)微信JS-API封裝接口的示例代碼
這篇文章主要介紹了node.js實現(xiàn)微信JS-API封裝接口的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09Node中完整的?node?addon?實現(xiàn)流程
這篇文章主要介紹了Node中完整的node?addon實現(xiàn)流程,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09window系統(tǒng) nodejs安裝opencv環(huán)境配置圖文詳解
這篇文章主要介紹了window系統(tǒng) nodejs安裝opencv環(huán)境配置,結合圖文形式詳細分析了window環(huán)境下 nodejs安裝opencv的具體步驟、注意事項2023-04-04Node.js使用Express創(chuàng)建Web項目詳細教程
如果需要入門使用node.js進行web開發(fā),正在學習 nodejs web開發(fā)指南 的和想快速了解node.js web開發(fā)模式的朋友,相信本文是有一定幫助意義的。2017-03-03