1. 程式人生 > >Node.js 日誌系統 log4js 介紹

Node.js 日誌系統 log4js 介紹

Node.js 日誌系統 log4js 介紹

關於 log4js ,此處不做過多介紹,你如果有關注過日誌系統,那就應該聽說過類似 log4cpplog4netlog4jlog4p 等名詞。是的,log4xxx 是 Apache 提供的開源日誌框架,它可以將日誌資訊按指定的格式、分級不同的級別輸出到多種介質(控制檯、檔案、資料庫等),並且還支援日誌檔案的自動備份等功能。不同的程式語言有不同的 log4xxx 版本,其中 log4js 便是 node.js 版本的,本文將從總體上介紹 log4js 的一些概念和使用方法。

最簡單的使用

首先讓我們來看一個最簡單的使用示例,編碼之前通過 npm

安裝 log4js 包。

npm install log4js

通過如下方式來使用 log4js 功能:

var log4js = require('log4js');
var logger = log4js.getLogger();

logger.level = "info"; // default level is OFF - which means no logs at all.
logger.info("Log from default logger");

輸出結果:

[2018-11-13T19:18:54.225] [INFO] default - Log from default logger

注意,預設的 leveloff,不會輸入任何資訊,info 方法會報錯。除了 info 方法外,還有 errorwarn 等方法,只有啟用了相應的 level 的情況下才能呼叫相關的方法。級別的順序為:

載入配置項

log4js 支援兩種配置方式,一種是 json 檔案,另一種是 json 物件。兩種方式的原理是一樣的,下面以 json 物件為例來說明如何進行配置。

var log4js = require('log4js');

log4js.configure({
    appenders:{
        std: { type: "stdout", level:
"all", layout:{type: "basic", } }, file: { type: "file", filename: "log.txt", encoding: "utf-8" } }, categories: { default: {appenders: ["std"], level: "debug"}, custom: {appenders: ["std", "file"], level: "all"} } }); var logger = log4js.getLogger("custom"); logger.warn("I will be logged both in console and log.txt");

如上程式碼所示,先是配置了 defaultcustom 兩個日誌器,後面呼叫了 custom 日誌器來輸出一條 warm 級別的日誌。由於 custom 日誌器引用了 stdfile 兩個 appender,所以該條日誌將同時被輸出到 stdout(控制檯) 和 log.txt(檔案)。

[2018-11-13T21:12:12.682] [WARN] custom - I will be logged in log.txt

注意:除錯狀態下日誌資訊不會被輸出到檔案中,只有在執行狀態下才會,這跟 log4js 的內部實現有關,它判斷了當前的工作執行緒,具體可參閱文末的參考資料。

通過如上程式碼的演示,你應該基本瞭解了 log4js 的配置,我將在下一節中介紹各個配置的項的含義。

幾個核心概念

如上圖所示,我們已經在上一節的配置介紹中接觸到這些概念。總的來說,log4jscategoryappenderlayout 三大部分構成,其中 category 是日誌器例項,每個例項中可以包含多個 appender,而每個 appender 中包含一個 layoutappender 用於指定日誌的輸出位置(控制檯、檔案等),layout 用於定義日誌的輸出格式。

layout

layout 用於定義每條日誌的輸出格式,log4js 內建瞭如下幾種型別的 layout

  • basic:輸出時間戳、級別,、別,後跟格式化的日誌事件資料
  • coloured (or colored):與 basic 相似,只是會根據日誌的級別進行著色
  • messagePassThrough:格式化日誌事件資料,不輸出時間戳,級別或類別
  • dummy:僅輸出日誌事件資料中的第一個值,用處不大
  • pattern:按照指定的模式進行輸出

我們重點來看一下 pattern 型別的 layout 是如何配置的:

log4js.configure({
    appenders: {
      std: { type: 'stdout', layout: {
          type: 'pattern',
          pattern: '%d %p %c %x{user} %m%n',
          tokens: { user: function(logEvent) { return AuthLibrary.currentUser(); }}
        }}
    },
    categories: { default: { appenders: ['srd'], level: 'info' } }
  });
  
var logger = log4js.getLogger();
logger.info('doing something.');

其中,%d%p%n 等表示的是日誌系統中的變數,%d 指的是 日期時間%p 指的是 日誌等級%n 指的是 換行 ;另外,%x{user} 指的是將動態令牌 user 新增到日誌中。除此之外,我們還可以使用 log4js.addLayout(type, fn) 來新增自定義的 layout

appender

定義日誌的輸出介質,常用的 appender 有如下兩種:

  • stdout 或 stderr :將日誌輸出到彩色控制檯中,前者是預設的 appender
  • file :將日誌輸出到檔案,可以指定單個日誌檔案的大小、滾動備份等

另外還有 SMTPLoggyTCPAppender

log4js.configure({
  appenders: {
    network: { type: 'tcp', host: 'log.server', port: 12701 }
  },
  categories: {
    default: { appenders: ['network'], level: 'error' }
  }
});

category

category 指的是日誌器例項,我們通過 log4js.getLogger() 拿到的是 log4js 系統中預設的日誌器,還可以通過指定的名稱來獲取配置檔案中相應的日誌器。一個日誌系統中可以有多個 category ,每個 category 中可以有多個 appender

log4js.configure({
    appenders:{
        std: { type: "stdout", level: "all", layout:{type: "basic", } },
        file: { type: "file", filename: "log.txt", encoding: "utf-8" }
    },
    categories: {
        default: {appenders: ["std"], level: "debug"},
        custom: {appenders: ["std", "file"], level: "all"}
    }
});

var logger = log4js.getLogger("custom");
logger.warn("I will be logged both in console and log.txt");

如上程式碼所示,配置檔案中定義了 defaultcustom 兩個日誌器,使用 log4js.getLogger("custom") 獲取了 custom 日誌器,並用它來將入日誌同時輸出到控制檯和檔案中。

參考資料