所有的 Moleculer 核心模組都有一個客製化 Logger 實例,它是繼承自 Broker 選項配置中的 Broker Logger 實例。
Console
是預設的 Logger ,它可以將所有的 log 訊息印在主控台。它支援多種內建的格式化器,也可以自行客製化建立屬於自己的工具。
範例:快速設定
moleculer.config.js
module.exports = {
// 啟用 Console logger
logger: true,
};
範例:快速設定指定的 Logger,可用 Console
、 File
、 Pino
、 Bunyan
、 Winston
、 Debug
、 Log4js
、 Datadog
。
module.exports = {
logger: "Console",
};
範例:完整設定
moleculer.config.js
module.exports = {
logger: {
type: "Console",
options: {
level: "info",
colors: true,
moduleColors: false,
formatter: "full",
objectPrinter: null,
autoPadding: false
}
}
};
參數:
level
<String> Log 等級colors
<Boolean> 顏色輸出moduleColors
<Boolean> 不同的模組顏色formatter
<String> 支援的輸出格式 json
、 short
、 simple
、 full
、 Function
,以及模板字串 {timestamp} {level} {nodeID}/{mod}: {msg}
objectPrinter
<String> 客製化物件轉換字串方式。預設為 util.inspect
autoPadding
<Boolean> 自動模組名稱開頭切齊在同一列範例:使用方式
可以在核心模組使用 this.logger
輸出 log 資訊。
this.logger.info("Info log");
this.logger.fatal("Fatal log");
this.logger.warn("Warning log");
this.logger.error("Error log");
範例: full
格式 (預設值)
moleculer.config.js
module.exports = {
logger: {
type: "Console",
options: {
formatter: "full" // 或 `null`
}
}
};
Fig. 1. full
格式預覽圖
範例: short
格式
moleculer.config.js
module.exports = {
logger: {
type: "Console",
options: {
formatter: "short"
}
}
};
Fig. 2. short
格式預覽圖
範例: simple
格式
moleculer.config.js
module.exports = {
logger: {
type: "Console",
options: {
formatter: "simple"
}
}
};
Fig. 3. simple
格式預覽圖
範例: json
格式
moleculer.config.js
module.exports = {
logger: {
type: "Console",
options: {
formatter: "json"
}
}
};
Fig. 4. json
格式預覽圖
範例: 客製化格式
moleculer.config.js
module.exports = {
logger: {
type: "Console",
options: {
formatter: (level, args, bindings) => [`[${level.toUpperCase()}]`, ...args]
}
}
};
Fig. 5. 客製化格式預覽圖
Logger 可以將所有 log 都存放在檔案,同樣支援各種格式化文字。
範例:
moleculer.config.js
module.exports = {
logger: {
type: "File",
options: {
level: "info",
folder: "./logs",
filename: "moleculer-{date}.log",
formatter: "json",
objectPrinter: null,
eol: "\n",
interval: 1 * 1000
}
}
};
參數:
level
<String> Log 等級folder
<String> 輸出目錄,預設為 logs
目錄,可以使用模板字串 {nodeID}
、 {namespace}
。filename
<String> 檔案名稱,預設為 moleculer-{date}.log
,可以使用模板字串 {date}
、 {nodeID}
、 {namespace}
。formatter
<String> 支援的輸出格式 json
、 short
、 simple
、 full
、 Function
,以及模板字串 {timestamp} {level} {nodeID}/{mod}: {msg}
objectPrinter
<String> 客製化物件轉換字串方式。預設為 util.inspect
eol
<String> 行結束字元,預設使用系統設定interval
<Number> 檔案寫入間隔 (毫秒)範例:使用 Pino logger
使用前請安裝 Pino 套件 npm install pino --save
。
moleculer.config.js
module.exports = {
logger: {
type: "Pino",
options: {
level: "info",
pino: {
options: null,
destination: "/logs/moleculer.log",
}
}
}
};
參數:
option
請參閱: https://getpino.io/#/docs/api?id=options-object
destination
請參閱: https://getpino.io/#/docs/api?id=destination-sonicboom-writablestream-string-object
Fig. 6. Pino 預覽圖
範例:使用 Bunyan logger
使用前請安裝 Bunyan 套件 npm install bunyan --save
。
參數請參閱: https://github.com/trentm/node-bunyan#constructor-api
moleculer.config.js
module.exports = {
logger: {
type: "Bunyan",
options: {
level: "info",
bunyan: {
name: "moleculer"
}
}
}
};
Fig. 7. Bunyan 預覽圖
範例:使用 Winston logger
使用前請安裝 Winston 套件 npm install winston --save
。
參數請參閱: https://github.com/winstonjs/winston#creating-your-own-logger
moleculer.config.js
const winston = require("winston");
module.exports = {
logger: {
type: "Winston",
options: {
level: "info",
winston: {
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: "/logs/moleculer.log" })
]
}
}
}
};
Fig. 8. Winston 預覽圖
範例:使用 debug logger
若要查看訊息,需要設定環境變數 export DEBUG=moleculer:*
,使用前請安裝 Winston 套件 npm install debug --save
。
參數請參閱: https://github.com/debug-js/debug
moleculer.config.js
module.exports = {
logger: {
type: "Debug",
options: {
level: "info",
}
}
};
Fig. 9. debug 預覽圖
範例:使用 debug logger
使用前請安裝 Winston 套件 npm install log4js --save
。
參數請參閱: https://github.com/log4js-node/log4js-node#usage
moleculer.config.js
module.exports = {
logger: {
type: "Log4js",
options: {
level: "info",
log4js: {
appenders: {
app: { type: "file", filename: "/logs/moleculer.log" }
},
categories: {
default: { appenders: [ "app" ], level: "debug" }
}
}
}
}
};
Fig. 10. debug 預覽圖
範例:使用 Datadog logger 上傳至伺服器
注意, Datadog 只會將 log 收集並上傳,並不會在主控台顯示任何訊息。
參數請參閱: https://docs.datadoghq.com/api/latest/logs/#send-logs
moleculer.config.js
module.exports = {
logger: {
type: "Datadog",
options: {
// Logging level
level: "info",
// Datadog 服務終端
url: "https://http-intake.logs.datadoghq.com/v1/input/",
// Datadog API key
apiKey: process.env.DATADOG_API_KEY,
// Datadog 來源參數
ddSource: "moleculer",
// Datadog 環境變數
env: undefined,
// Datadog hostname 參數
hostname: os.hostname(),
// 客製化物件轉換字串方式
objectPrinter: null,
// 上傳頻率
interval: 10 * 1000
}
}
};
Fig. 11. debug 預覽圖
Logger 允許配置多個 Logger ,也可以使用相同類型的 Logger 但是設定不同的 log 級別。
範例:建立一個 Console
logger 搭配兩個不同級別與格式的 File
logger 。
moleculer.config.js
module.exports = {
logger: [
{
type: "Console",
options: {
level: "info",
}
},
{
type: "File",
options: {
level: "info",
folder: "/logs/moleculer",
filename: "all-{date}.log",
formatter: "{timestamp} {level} {nodeID}/{mod}: {msg}"
}
},
{
type: "File",
options: {
level: "error",
folder: "/logs/moleculer",
filename: "errors-{date}.json",
formatter: "json"
}
}
]
};
你可以在最上層設定 logLevel
,它將會是一個全域的設定。然後你可以在每個 logger 設定內個別設定 level
來覆蓋全域設定,也可以透過萬用字元過濾服務或模組的 log。
moleculer.config.js
module.exports = {
logger: [
// 快速設定 log
"Console",
{
// 限制儲存 `GREETER` 模組以外的 log
type: "File",
options: {
level: {
"GREETER": false,
"**": "info"
},
filename: "moleculer-{date}.log"
}
},
{
// 限制僅儲存 `GREETER` 模組的 log
type: "File",
options: {
level: {
"GREETER": "debug",
"**": false
},
filename: "greeter-{date}.log"
}
}
],
// 全域級別設定
logLevel: {
"TRACING": "trace",
"TRANS*": "warn",
"GREETER": "debug",
"**": "info",
}
};
若套件仍無法滿足需求,你也可以透過 BaseLogger
來建構客製化的 Logger ,但至少要實作 getLogHandler
方法。
moleculer.config.js
const BaseLogger = require("moleculer").Loggers.Base;
class MyLogger extends BaseLogger {
getLogHandler(bindings) {
return (type, args) => console[type](`[MYLOG-${bindings.mod}]`, ...args);
}
}
module.exports = {
logger: new MyLogger()
};
[1] Logging, https://moleculer.services/docs/0.14/logging.html