nodejs之日誌管理

來源:互聯網
上載者:User

nodejs之日誌管理
開發一個項目時,可以通過控制台輸出或者debug來擷取到項目的運行資訊。當項目上線時,我們就需要通過日誌來分析。如同Java的log4j,nodejs中也有相關的log4js。使用過log4j的同學應該對此不會陌生。   1、記錄層級log4js共有6種記錄層級,分別為:trace、debug、info、warn、error、fatal。權值從小到大,其初始化代碼為: TRACE: new Level(5000, "TRACE"), DEBUG: new Level(10000, "DEBUG"), INFO: new Level(20000, "INFO"), WARN: new Level(30000, "WARN"), ERROR: new Level(40000, "ERROR"), FATAL: new Level(50000, "FATAL"),假如設定預設的記錄層級為info,那麼權值小於info的日誌不會被記錄下來,也就是說只有調用log.info(), log.warn(), log.error()或者log.fatal()才會觸發記錄日誌。該部分代碼在lib/logger.js中。 複製代碼Logger.prototype.log = function() {  var args = Array.prototype.slice.call(arguments)  , logLevel = levels.toLevel(args.shift())  , loggingEvent;  if (this.isLevelEnabled(logLevel)) {    loggingEvent = new LoggingEvent(this.category, logLevel, args, this);    this.emit("log", loggingEvent);  }};複製代碼 2、整合expresslog4js可以作為express的一個中介軟體來使用。首先需要引入log4js var express = require("express");var log4js = require("log4js"); var app = express();接著配置log4js log4js.configure({ appenders: [   { type: 'console' },   { type: 'file', filename: 'cheese.log', category: 'cheese' }  ]});該配置的意思是console是預設的appender,使用cheese這個appender時會將日誌記錄檔案中,記錄檔名為cheese.log。   然後用use串連到中介軟體,我們預設使用的是cheese這個appender,層級為info。 app.use(log4js.connectLogger(log4js.getLogger("cheese"), {level: log4js.levels.INFO}));  其輸出與此類似: [2014-07-04 20:27:21.205] [INFO] cheese - 127.0.0.1 - - "GET / HTTP/1.1" 200 22896 "" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36" ......   3、再修改一下中介軟體上面的做法是可以的,只是當中介軟體太多的時候,都寫在同一個檔案中也許感覺會有些醜陋。所以我傾向於將其分離出來作為單獨的一個模組,也就是一個單獨的檔案。然後對外暴露介面。 複製代碼var path = require("path");var log4js = require("log4js");  /** * 日誌配置 */exports.configure = function() {    log4js.configure(path.join(__dirname, "log4js.json"));    } /** * 暴露到應用的日誌介面,調用該方法前必須確保已經configure過 * @param name 指定log4js設定檔中的category。依此找到對應的appender。 *              如果appender沒有寫上category,則為預設的category。可以有多個 * @returns {Logger} */exports.logger = function(name) {    var dateFileLog = log4js.getLogger(name);    dateFileLog.setLevel(log4js.levels.INFO);    return dateFileLog;} /** * 用於express中介軟體,調用該方法前必須確保已經configure過 * @returns {Function|*} */exports.useLog = function() {    return log4js.connectLogger(log4js.getLogger("app"), {level: log4js.levels.INFO});} 複製代碼log4js.json檔案內容如下 複製代碼{    "appenders": [        {            "type": "console"        },        {            "type": "dateFile",            "filename": "logs/booklist.log",            "pattern": "-yyyy-MM-dd",            "alwaysIncludePattern": true        }    ]}複製代碼配置很簡單,配置了兩個appender,一個是控制台的,一個是dateFile,意思是每天都產生一個記錄檔。注意到我這裡並沒有配置category,這樣的話當沒有找到對應的appender時,這兩個appender就是預設的appender。有些時候明明感覺配置沒有錯,但是記錄檔並沒有產生日誌,往往問題就出在這裡。   然後在app.js中我們修改為如下 複製代碼var express = require("express");// 這個是我們上面自訂的模組var log4js = require("./log"); var app = express();app.configure(); app.use(log4js.useLog()); ...複製代碼 4、單進程與多進程好了,上面對於單進程是適用的,但是如果你的nodejs應用是多進程的,使用上面的配置你會看到日誌的輸出有點奇怪,比如:   感覺有點像是資源搶佔了。   log4js的wiki中有給出multiprocess的配置。但是當時使用的時候也會有問題,當時沒有細究。不過社區中有人建立了另外一種方式,我採用了這種。可以參看一下這個issue。下面我們來配置一下。修改我們在上面修改的log模組檔案,變為: 複製代碼var path = require("path");var log4js = require("log4js");  /** * 多進程的日誌配置 */exports.configure = function(mode) {    if (mode === "master") {        log4js.configure(path.join(__dirname, "./log4js-master.json"));    } else {        // 多進程的配置項        log4js.configure(path.join(__dirname, "./log4js-worker.json"));        // 單進程的配置項//        log4js.configure(path.join(__dirname, "../config/log4js.json"));    }} /** * 暴露到應用的日誌介面,調用該方法前必須確保已經configure過 * @param name 指定log4js設定檔中的category。依此找到對應的appender。 *              如果appender沒有寫上category,則為預設的category。可以有多個 * @returns {Logger} */exports.logger = function(name) {    var dateFileLog = log4js.getLogger(name);    dateFileLog.setLevel(log4js.levels.INFO);    return dateFileLog;} /** * 用於express中介軟體,調用該方法前必須確保已經configure過 * @returns {Function|*} */exports.useLog = function() {    return log4js.connectLogger(log4js.getLogger("app"), {level: log4js.levels.INFO});}複製代碼主要是修改了configure方法。 log4js-master.json的內容為: 複製代碼{    "appenders": [{        "type": "clustered",        "appenders": [            {                "type": "console"            },            {                "type": "dateFile",                "filename": "logs/booklist.log",                "pattern": "-yyyy-MM-dd",                "alwaysIncludePattern": true,                "pollInterval": 1,                "category": "dateFileLog"            }        ]    }]}複製代碼log4js-worker.js的內容為: {    "appenders": [{        "type": "clustered"    }]}  假設主進程的內容在檔案master.js,背景工作處理序在worker.js。master.js中的配置內容為: var log4js = require("./lib/log");log4js.configure("master");worker.js的配置內容為: 複製代碼var express = require("express");// 這個是我們上面自訂的模組var log4js = require("./log"); var app = express();app.configure("worker"); app.use(log4js.useLog()); ...複製代碼如此就完成了。   需要在某個地方記錄日誌的時候,我們可以如此 var log = require("./log").logger("index"); // logger中的參數隨便起 ... log.info("...");log.error("...") 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.