Node.js 日誌系統 log4js 介紹
Node.js 日誌系統 log4js 介紹
關於 log4js
,此處不做過多介紹,你如果有關注過日誌系統,那就應該聽說過類似 log4cpp
、log4net
、log4j
、log4p
等名詞。是的,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
注意,預設的 level
是 off
,不會輸入任何資訊,info
方法會報錯。除了 info
方法外,還有 error
、warn
等方法,只有啟用了相應的 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");
如上程式碼所示,先是配置了 default
和 custom
兩個日誌器,後面呼叫了 custom
日誌器來輸出一條 warm
級別的日誌。由於 custom
日誌器引用了 std
和 file
兩個 appender
,所以該條日誌將同時被輸出到 stdout
(控制檯) 和 log.txt
(檔案)。
[2018-11-13T21:12:12.682] [WARN] custom - I will be logged in log.txt
注意:除錯狀態下日誌資訊不會被輸出到檔案中,只有在執行狀態下才會,這跟
log4js
的內部實現有關,它判斷了當前的工作執行緒,具體可參閱文末的參考資料。
通過如上程式碼的演示,你應該基本瞭解了 log4js
的配置,我將在下一節中介紹各個配置的項的含義。
幾個核心概念
如上圖所示,我們已經在上一節的配置介紹中接觸到這些概念。總的來說,log4js
由 category
、appender
、layout
三大部分構成,其中 category
是日誌器例項,每個例項中可以包含多個 appender
,而每個 appender
中包含一個 layout
,appender
用於指定日誌的輸出位置(控制檯、檔案等),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 :將日誌輸出到檔案,可以指定單個日誌檔案的大小、滾動備份等
另外還有 SMTP、Loggy、TCP
等 Appender
。
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");
如上程式碼所示,配置檔案中定義了 default
和 custom
兩個日誌器,使用 log4js.getLogger("custom")
獲取了 custom
日誌器,並用它來將入日誌同時輸出到控制檯和檔案中。