iT邦幫忙

2022 iThome 鐵人賽

DAY 12
2

Logging

所有的 Moleculer 核心模組都有一個客製化 Logger 實例,它是繼承自 Broker 選項配置中的 Broker Logger 實例。

內建 Logger

Console

Console 是預設的 Logger ,它可以將所有的 log 訊息印在主控台。它支援多種內建的格式化器,也可以自行客製化建立屬於自己的工具。

範例:快速設定

moleculer.config.js

module.exports = {
    // 啟用 Console logger
    logger: true,
};

範例:快速設定指定的 Logger,可用 ConsoleFilePinoBunyanWinstonDebugLog4jsDatadog

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> 支援的輸出格式 jsonshortsimplefullFunction ,以及模板字串 {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> 支援的輸出格式 jsonshortsimplefullFunction ,以及模板字串 {timestamp} {level} {nodeID}/{mod}: {msg}
  • objectPrinter <String> 客製化物件轉換字串方式。預設為 util.inspect
  • eol <String> 行結束字元,預設使用系統設定
  • interval <Number> 檔案寫入間隔 (毫秒)

第三方 Logger

Pino

範例:使用 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",
            }
        }
    }
};

參數:


Fig. 6. Pino 預覽圖

Bunyan

範例:使用 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

範例:使用 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

範例:使用 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 預覽圖

Log4js

範例:使用 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

範例:使用 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 預覽圖

多個 Loggers

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",
    }
};

客製化 logger

若套件仍無法滿足需求,你也可以透過 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

家家酒小劇場

  • Otter - 微服務這麼多,是不會是有好多 log 分散在各地呢?
  • Boxy - 妳很聰明,這些分散在各地的 log ,其實可以透過一些 log 匯總工具來處理唷。

上一篇
Day 11 : 生命週期
下一篇
Day 13 : Middlewares
系列文
Moleculer 家家酒31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言