首頁  >  文章  >  web前端  >  淺析Node.js+Winston函式庫如何建構簡單日誌功能

淺析Node.js+Winston函式庫如何建構簡單日誌功能

青灯夜游
青灯夜游轉載
2021-10-20 10:01:211681瀏覽

這篇文章跟大家介紹一下Node.js中使用Winston函式庫建立一個簡單日誌功能的方法,希望對大家有幫助!

淺析Node.js+Winston函式庫如何建構簡單日誌功能

Winston  是強大、靈活的 Node.js 開源日誌庫之一,理論上, Winston  是一個可以記錄所有資訊的記錄器。這是一個高度直覺的工具,易於自訂。可以透過更改幾行程式碼來調整背後的邏輯。它使對資料庫或檔案等持久性儲存位置的日誌記錄變得簡單且容易。 【推薦學習:《nodejs 教學》】

Winston 提供以下功能:

  • 集中控制日誌記錄的方式和時間:在一個地方更改程式碼即可
  • 控制日誌發送的位置:將日誌同步儲存到多個目的地(如Elasticsearch、MongoDB、Postgres等)。
  • 自訂日誌格式:帶有時間戳記、顏色日誌等級、JSON格式等前綴。

winston實務

實作程式碼將在專案pretender-service 中增加日誌功能,安裝依賴:

npm install winston --save

接下來需要初始化logger ,由於專案中已經存在一個logger.js 文件,這裡再建立一個winstonLogger.js ,程式碼如下:

const { createLogger, format, transports } = require("winston");

module.exports = createLogger({
    transports: [
        new transports.File({
            filename: "logs/server.log",
            level: "info",
            format: format.combine(
                format.timestamp({ format: "MMM-DD-YYYY HH:mm:ss" }),
                format.align(),
                format.printf(
                    (info) =>
                        `${info.level}: ${[info.timestamp]}: ${info.message}`
                )
            ),
        }),
    ],
});

透過呼叫winston 函式庫中的createLogger 函數來初始化記錄器。在 transports 物件中,可以提供一個檔案名稱將日誌儲存在檔案中。預設情況下,日誌記錄未格式化並列印為帶有兩個參數的 JSON 字串,日誌訊息和等級。

下面對先前的logger 進行修改,將winston 日誌記錄器加入進去,具體修改方式參閱程式碼,下面給出其使用方法:

const winlogger = require("./winstonLogger");
winlogger.info("日志内容");

執行程式後可以會在根目錄產生對應的日誌檔案 logs/server.log

淺析Node.js+Winston函式庫如何建構簡單日誌功能

也可以更改日誌級別,修改logger ,只在console.error 方式下使用winston

淺析Node.js+Winston函式庫如何建構簡單日誌功能

##記錄了資料庫連接錯誤訊息,上面的訊息僅只是為了演示。

多重transports

winston 允許設定多種transport ,在winstonLogger.js  中變更createLogger 函數如下:

const { createLogger, format, transports } = require("winston");

module.exports = createLogger({
    format: format.combine(
        format.timestamp({ format: "MMM-DD-YYYY HH:mm:ss" }),
        format.align(),
        format.printf((i) => `${i.level}: ${[i.timestamp]}: ${i.message}`)
    ),
    transports: [
        new transports.File({
            filename: "logs/info.log",
            level: "info",
            format: format.combine(
                format.printf((i) =>
                    i.level === "info"
                        ? `${i.level}: ${i.timestamp} ${i.message}`
                        : ""
                )
            ),
        }),
        new transports.File({
            filename: "logs/error.log",
            level: "error",
        }),
    ],
});

再次執行程序,將會看到

error.log info.log 文件,由於在logger中未設定info ,因此info.log 的內容為空,error.log 內容和上面的一樣。

多loggers

winston 允許設定多個logger ,在實際專案中可以為每個模組建立一個記錄器logger , 如下程式碼,建立一個使用者日誌記錄器和登入驗證記錄器:

const { createLogger, format, transports } = require("winston");

const customFormat = format.combine(
    format.timestamp({ format: "MMM-DD-YYYY HH:mm:ss" }),
    format.align(),
    format.printf((i) => `${i.level}: ${[i.timestamp]}: ${i.message}`)
);

const globalLogger = createLogger({
    format: customFormat,
    transports: [
        new transports.File({
            filename: "logs/info.log",
            level: "info",
            format: format.combine(
                format.printf((i) =>
                    i.level === "info"
                        ? `${i.level}: ${i.timestamp} ${i.message}`
                        : ""
                )
            ),
        }),
        new transports.File({
            filename: "logs/error.log",
            level: "error",
        }),
    ],
});

const authLogger = createLogger({
    transports: [
        new transports.File({
            filename: "logs/authLog.log",
            format: customFormat,
        }),
    ],
});

module.exports = {
    globalLogger: globalLogger,
    authLogger: authLogger,
};

修改後程式碼建立了一個全域記錄器

globalLogger 和一個鑑權記錄器authLogger ,對應修改 logger.js

const { globalLogger } = require("./winstonLogger");
globalLogger.error(message);

每日滾動日誌檔案

正如前面介紹的最佳實踐中提到的,按照特定的條件對日誌檔案進行分割,通常依照日期、大小進行分割,並設定已儲存的日誌天數。要實現這些需求,要有一個安裝一個  

Winston  相關的依賴函式庫。

npm install winston-daily-rotate-file --save

安裝完成後使用以下程式碼更新到

winstonLogger.js 檔案:

const { createLogger, format, transports } = require("winston");
require("winston-daily-rotate-file");

const customFormat = format.combine(
    format.timestamp({ format: "MMM-DD-YYYY HH:mm:ss" }),
    format.align(),
    format.printf((i) => `${i.level}: ${[i.timestamp]}: ${i.message}`)
);
const defaultOptions = {
    format: customFormat,
    datePattern: "YYYY-MM-DD",
    zippedArchive: true,
    maxSize: "20m",
    maxFiles: "14d",
};
const globalLogger = createLogger({
    format: customFormat,
    transports: [
        new transports.DailyRotateFile({
            filename: "logs/info-%DATE%.log",
            level: "info",
            ...defaultOptions,
        }),
        new transports.DailyRotateFile({
            filename: "logs/error-%DATE%.log",
            level: "error",
            ...defaultOptions,
        }),
    ],
});

const authLogger = createLogger({
    transports: [
        new transports.DailyRotateFile({
            filename: "logs/authLog-%DATE%.log",
            ...defaultOptions,
        }),
    ],
});

module.exports = {
    globalLogger: globalLogger,
    authLogger: authLogger,
};

執行項目,可以看到日誌檔案:

淺析Node.js+Winston函式庫如何建構簡單日誌功能

至此,

Winston 的基本使用指南介紹完了,以上這些基本可以滿足日常專案的需要了。

更多程式相關知識,請造訪:程式設計影片! !

以上是淺析Node.js+Winston函式庫如何建構簡單日誌功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除