NodeJS 로그 미들웨어 log4js 사용 패키지

프레임 워 크 수요 에 따라 로그 미들웨어 (log4js) 의 사용 모듈 을 봉 인 했 습 니 다. 하 나 는 파일 을 남 기 는 것 이 고, 다른 하 나 는 같은 수 요 를 가 진 대중 에 게 공유 하 는 것 입 니 다.
우선 npm 명령 을 통 해 log4js 미들웨어 를 프로젝트 의 작업 디 렉 터 리 에 설치 해 야 합 니 다.
그리고 새 파일 (예 를 들 어 FLogger. js) 을 만 들 고 이 파일 에서 log4js 미들웨어 를 사용 하여 패키지 합 니 다.
코드 는 다음 과 같 습 니 다:
//
// Author: Fanrncho
// Date: 2019/06/24
// Desc: log4js        
//

const log4js = require('log4js');

var LogType = {
    NONE: "none",
    DEBUG: "debug",
    INFO: "info",
    WARN: "warn",
    ERROR: "error",
    FATAL: "fatal",
}

var LogTypeOrder = {
    NONE: 0,
    DEBUG: 1,
    INFO: 2,
    WARN: 3,
    ERROR: 4,
    FATAL: 5,
}

var Kinds = ["business", "net"];

function appenderFull(filename){
    return {
        type: "dateFile",
        filename: filename,  //         
        alwaysIncludePattern: true,  //(  ,  false)                    
        pattern: "-yyyy-MM-dd.log",  //(  ,   -yyyy-MM-dd)            。   :.yyyy-MM-dd-hh:mm:ss.log
        encoding: 'utf-8', //(  ,   utf-8)         
        maxLogSize: "1M" //        ,                      xxx.log.1         ,   :K M G
    }
}

var appenders = {default: appenderFull("./logs/default/default")};
var categories = {default: {appenders: ["default"], level: log4js.levels.ALL}};

for(const kind of Kinds){
    for(let type in LogType){
        if(LogType.hasOwnProperty(type)){
            type = LogType[type];
            let key = kind + "_" + type;
            appenders[key] = appenderFull(`./logs/${kind}/${type}/${type}`);
            categories[key] = {appenders: [key], level: type === LogType.NONE ? log4js.levels.ALL : type}
        }
    }
}

log4js.configure({
    appenders: appenders,
    categories: categories,
});

/**
   *       ,                 ,  "none"     ,           './logs/business/none/none.log'  ,
   * "error"     ,           './logs/business/error/error.log'  。
   * @param {LogType|String} type --      :"none", "debug", "info", "warn", "error", "fatal"。
   *                                            ,            "none"  ,     
   *                                            。
   * @param {...} arguments --     ,      (      ,    ,     type        )
   * @return {undefined}
   */
var KindIndex = 0;
exports.log = function(type){
    try {
        if(arguments.length === 0) return;
        let more = "";
        for(let i = 1; i < arguments.length; i++){
            more += (more === "" ? arguments[i] : "  " + arguments[i]);
        }
        if(typeof(type) === "string" && arguments.length > 1 && LogType[type.toUpperCase()]){
            type = type.toLowerCase();
            log4js.getLogger(Kinds[KindIndex] + "_" + type)[type === LogType.NONE ? LogType.DEBUG : type](more);
        }
        else{
            more = type + more;
            log4js.getLogger(Kinds[KindIndex] + "_" + LogType.NONE)[LogType.DEBUG](more);
        }
    } catch (error) {
        console.error(error);
    }
};

function _registerLogFunc(type){
    return function(){
        if(arguments.length === 0) return;
        let args = [type];
        for(let i = 0; i < arguments.length; i++){
            args.push(arguments[i]);
        }
        exports.log.apply(null, args);
    }
}

const DEFAULT_FORMAT = ':remote-addr - -'
  + ' ":method :url HTTP/:http-version"'
  + ' :status :content-length ":referrer"'
  + ' ":user-agent"';

  /**
   *           ,       "none",              './logs/net/none/none.log'  ,
   *           ,                    ,  "error"     ,           './logs/net/error/error.log'  。
   * @param {LogType} type --      :"none", "debug", "info", "warn", "error", "fatal"。
   *                                     ,            "none"  。
   * @return {function}
   */
exports.netLog = function(type){
    try {
        type = typeof(type) === "string" && LogType[type.toUpperCase()] ? type.toLowerCase() : LogType.NONE;
        return log4js.connectLogger(log4js.getLogger(Kinds[1] + "_" + LogType.NONE), {level: 'auto', format: function(req, res, callback){
            try {
                let level = LogType.INFO;
                if(res.statusCode){
                    if (res.statusCode >= 300) level = LogType.WARN;
                    if (res.statusCode >= 400) level = LogType.ERROR;
                }
                let record = callback(DEFAULT_FORMAT);
                let category = type === LogType.NONE ? type : level;
                KindIndex = 1;
                LogTypeOrder[category.toUpperCase()] >= LogTypeOrder[type.toUpperCase()] && exports.log(category, record);
                KindIndex = 0;
            } catch (error) {
                console.error(error);
            }
            return;
        }});
    } catch (error) {
        console.error(error);
    }
}

/**
 * exports.debug, exports.info, exports.warn, exports.error, exports.fatal       ,      。
 */
exports.debug = _registerLogFunc(LogType.DEBUG);
exports.info = _registerLogFunc(LogType.INFO);
exports.warn = _registerLogFunc(LogType.WARN);
exports.error = _registerLogFunc(LogType.ERROR);
exports.fatal = _registerLogFunc(LogType.FATAL);

다음은 로그 모듈 의 사용 예 코드 입 니 다:
var app = require('express')();  //web  

const FLogger = require('./FLogger');

FLogger.log("           none not paramters!", 111, "uuuuuuuuu", null, {jj: 188, name: "hello"});
FLogger.log("none", "           none");
FLogger.log("debug", "           debug!");
FLogger.log("info", "           info!", "jjjjjjj", 8888, 0.8, null, "hhhhhhh");
FLogger.log("warn", "           warn", "jjjjfd");
FLogger.log("error", "           error!", 66);
FLogger.log("fatal", "           fatal");

FLogger.debug("debug", "           debug111111111!");
FLogger.info("info", "           info11111111!", "777", null);
FLogger.warn("warn", "           warn111111111111", 1123);
FLogger.error("error", "           error11111111111!", null);
FLogger.fatal("fatal", "           fatal111111111111", "kkkkkkkkkkkk");

app.listen(9000);  //  web  

app.use(FLogger.netLog());
//app.use(FLogger.netLog("debug"));
//app.use(FLogger.netLog("info"));
//app.use(FLogger.netLog("warn"));
//app.use(FLogger.netLog("error"));
//app.use(FLogger.netLog("fatal"));





로그 의 출력 은 자신 이 설정 한 로그 형식 에 따라 작업 디 렉 터 리 의. / logs 폴 더 를 볼 수 있 습 니 다. express 프레임 워 크 에 등 록 된 로그 출력 이 라면. / logs / net 폴 더 를 보십시오.FLogger. log / debug / info /. warn /. error /. fatal 을 통 해 출력 된 로그 라면. / logs / business 폴 더 를 보십시오.

좋은 웹페이지 즐겨찾기