Node.js-日志管理模块使用与封装之log4js-node

log4js-node,源码地址:点击打开链接

1.配置(定义了4个日志记录器,分别写入到不同的日志目录)

{
    "customBaseDir": "logs/", //log目录
    "customDefaultAtt": {
        "type": "dateFile",  // 日志文件类型,可以使用日期作为文件名的占位符 
        "absolute": true,
        "alwaysIncludePattern": true // 文件名是否始终包含占位符  
    },
    "appenders": [
        {
            "type": "console",
            "category": "console"
        },
        {
            "pattern": "debug/yyyyMMdd.txt",
            "category": "logDebug"
        },
        {
            "pattern": "info/yyyyMMdd.txt",
            "category": "logInfo"
        },
        {
            "pattern": "warn/yyyyMMdd.txt",
            "category": "logWarn"
        },
        {
            "pattern": "err/yyyyMMdd.txt",
            "category": "logErr"
        }
    ],
    "replaceConsole": true,
    // 设置记录器的默认显示级别,低于这个级别的日志,不会输出  
    "levels": {
        "logDebug": "DEBUG",
        "logInfo": "DEBUG",
        "logWarn": "DEBUG",
        "logErr": "DEBUG"
    }
}

2.log4js 封装

logger.js

var log4js = require("log4js");
var fs = require("fs");
var path = require("path");

var helper = {};

// 加载配置文件
var objConfig = {
    "customBaseDir": "logs/",
    "customDefaultAtt": {
        "type": "dateFile",
        "alwaysIncludePattern": true
    },
    "appenders": [
        {"type": "console", "category": "console"},
        {"pattern": "debug/yyyyMMdd.txt", "category": "logDebug"},
        {"pattern": "info/yyyyMMdd.txt", "category": "logInfo"},
        {"pattern": "warn/yyyyMMdd.txt", "category": "logWarn"},
        {"pattern": "err/yyyyMMdd.txt", "category": "logErr"}
    ],
    "replaceConsole": true,
    "levels": {"logDebug": "DEBUG", "logInfo": "DEBUG", "logWarn": "DEBUG", "logErr": "DEBUG"}
};

// 检查配置文件所需的目录是否存在,不存在时创建
if (objConfig.appenders) {
    var baseDir = objConfig["customBaseDir"];
    var defaultAtt = objConfig["customDefaultAtt"];

    for (var i = 0, j = objConfig.appenders.length; i < j; i++) {
        var item = objConfig.appenders[i];
        if (item["type"] == "console")
            continue;

        if (defaultAtt != null) {
            for (var att in defaultAtt) {
                if (item[att] == null)
                    item[att] = defaultAtt[att];
            }
        }
        if (baseDir != null) {
            if (item["filename"] == null)
                item["filename"] = baseDir;
            else
                item["filename"] = baseDir + item["filename"];
        }
        var fileName = item["filename"];
        if (fileName == null)
            continue;
        var pattern = item["pattern"];
        if (pattern != null) {
            // fileName += pattern;
            fileName = pattern;
        }
    }
}else{
    throw new Error("请检查logo4js配置信息");
}

// 目录创建完毕,才加载配置,不然会出异常
log4js.configure(objConfig);

var logDebug = log4js.getLogger('logDebug');
var logInfo = log4js.getLogger('logInfo');
var logWarn = log4js.getLogger('logWarn');
var logErr = log4js.getLogger('logErr');

helper.debug = function (msg) {
    if (msg == null)
        msg = "";
    logDebug.debug(msg);
};

helper.info = function (msg) {
    if (msg == null)
        msg = "";
    logInfo.info(msg);
};

helper.warn = function (msg) {
    if (msg == null)
        msg = "";
    logWarn.warn(msg);
};

helper.error = function (msg, exp) {
    if (msg == null)
        msg = "";
    if (exp != null)
        msg += "\r\n" + exp;
    logErr.error(msg);
};

// 配合express用的方法
exports.use = function (app) {
    //页面请求日志, level用auto时,默认级别是WARN
    app.use(log4js.connectLogger(logInfo, {level: 'auto', format: ':method :url'}));
}

//导出模块
exports.helper = helper;

3.log4js 使用

router.js

const express = require('express');
const router = express.Router();
const logger = require("../logger").helper;


router.use('/', function (req, res, next) {
    logger.debug("咦,出错了!");
    res.send('okok');
});
module.exports = router;

4.跟 express 集成,可以输出客户端 GETPOSTURL

appjs

var logger = require('./logger');
var app = express();
	logger.use(app);        //由于加载顺序的原因,放在其他app.use前面