美文网首页nodeStrongLoopAmazing Arch
Nodejs log4js日志管理详解

Nodejs log4js日志管理详解

作者: simuty | 来源:发表于2017-09-23 20:55 被阅读1363次

    最近用到nodejs日志模块--log4js,弥补一下之前大致使用的迷惑。先看下图总览,接下来,主要由浅入深的记录log4js的常见配置。

    image.png

    第一部分 入口【收集日志】

    所谓的入口,其实就是所谓的收集日志信息,如何有效、分门别类的收集所需信息,使我们记录日志文件的第一步,当然,日志的作用就不在此啰嗦了。
    log4js提供了等级分类别名分类

    配置

    npm install log4js
    
    

    1.1 等级分类

    创建文件testLog4.js,

    //testLog4.js
    var log4js = require('log4js');
    //logger 是log4js的实例
    var logger = log4js.getLogger();
    logger.trace('this is trace');
    logger.debug('this is debug');
    logger.info('this is info');
    logger.warn('this is warn');
    logger.error('this is error');
    logger.fatal('this is fatal');
    
    

    结果为

    image.png

    类似于console实例中的log/error等,这里先实例化log4js,采用不同的等级输出不同的信息。等级有低到高颜色渐变。

    image.png

    以上图片剽窃自Node.js 之 log4js 完全讲解.

    很直观的将不同的等级的日志分类。一方面方便了我们查看终端日志,另外之后在过滤中同样可以起到作用。

    分等级不就是为了便于查找么,第一种分类法到此结束。

    1.2 类型分类

    实例化log4js时指定一个别名,然后在日志中可以方便区分哪个文件等。

    //testLog4.js
    /*
      类型分类
     */
    //实例化时,唯一可以传的一个参数category
    var logger = log4js.getLogger('随便起名字啦');
    logger.trace('this is trace');
    logger.debug('this is debug');
    logger.info('this is info');
    logger.warn('this is warn');
    logger.error('this is error');
    logger.fatal('this is fatal');
    

    如下图

    image.png

    一图胜前言,收集日志的方法都有了,具体的使用方法,后续罗列,紧接的任务就是如何保存?

    第二部分 出口【输出日志】

    2.1 Appender

    刚我们只是初始化实例,以不同的类型、等级输出。默认为console输出,如何保存在文件中,就是appender上场了。

    image.png
    2.1.1 file保存
    //testLog4.js
    log4js.configure({
      //是appenders,不是单数
      appenders:[{
          //以文件格式存储
          type: 'file',
          //自动创建123.log文件
          filename: '123.log'
        }]
    })
    var logger = log4js.getLogger('appenders');
    logger.info('this no error');
    

    结果保存在123.log中:

    //123.log
    [2017-09-23 16:01:59.940] [INFO] appenders - this no error
    
    2.1.2 datefile保存

    最简单的日期保存例子,将日志保存在日志文件中,以天为单位。

    //testLog4.js
    /*
      dateFile,根据时间保存文件位置,文件自动创建
     */
    log4js.configure({
      appenders:[{
        type: 'dateFile',
        //文件名为= filename + pattern, 设置为alwaysIncludePattern:true
        filename: '234',
        pattern: '-yyyy-MM-dd.log',
        //包含模型
        alwaysIncludePattern: true,
      }]
    })
    var logger = log4js.getLogger();
    logger.info('this is datefile');
    
    

    结果:

    //234-2017-09-23.log
    [2017-09-23 16:17:06.764] [INFO] [default] - this is datefile
    
    
    2.1.3 levelFilter 过滤筛选
    /*
      loglevelFilter 过滤筛选
     */
    
    log4js.configure({
      appenders:[
        //控制台输出
        {"type": "console"},
        { //日志过滤
          type: 'loglevelFilter',
          //  权重大于或者等于level【debug】的日志将会输出
          level: 'WARN',
          //筛选model1
          category: 'model1',
          // 同时支持数组
          // category:['model1', 'model2'],
          appender:{
            type: 'file',
            filename: '345.log'
          }
        }
      ],
      "replaceConsole": true
    
    })
    
    var logger = log4js.getLogger('model1');
    logger.trace('this is trace');
    logger.debug('this is debug');
    logger.info('this is info');
    logger.warn('this is warn');
    logger.error('this is error');
    logger.fatal('this is fatal');
    
    var logger = log4js.getLogger('model2');
    logger.trace('this is trace');
    logger.debug('this is debug');
    logger.info('this is info');
    logger.warn('this is warn');
    logger.error('this is error');
    logger.fatal('this is fatal');
    
    

    结果筛选如下

    image.png

    第三部分 layout配置

    暂缓

    第四部分 实例配置Express+log4js

    4.1 需求一

    1. 每天生成一个日志文件,放在/logs目录下,名字如2017-09-23.log;
    2. 单独将log4js配置在一个文件中,外界不需要每次配置;
    3. 记录客户端请求的HTTP状态码、URL、方法。
    4. 终端显示所有日志信息,日志文件只记录WARN以及以上级别的信息。

    GitHub--地址

    配置文件:logConfig.js

    var log4js = require('log4js');
    const fs = require('fs');
    
    levels = {
        'trace': log4js.levels.TRACE,
        'debug': log4js.levels.DEBUG,
        'info': log4js.levels.INFO,
        'warn': log4js.levels.WARN,
        'error': log4js.levels.ERROR,
        'fatal': log4js.levels.FATAL
    };
    
    function judgePath(pathStr) {
        if (!fs.existsSync(pathStr)) {
            fs.mkdirSync(pathStr);
            console.log('createPath: ' + pathStr);
        }
    }
    
    log4js.configure({
      appenders:[
        //控制台输出
        {"type": "console"},
        {type: 'dateFile',
        //文件名为= filename + pattern, 设置为alwaysIncludePattern:true
        filename: 'logs/', // 需要手动创建此文件夹
        pattern: 'yyyy-MM-dd.log',
        //包含模型
        alwaysIncludePattern: true,
      }],
      replaceConsole: true // 替换 console.log
    })
    
    exports.logger = function (name, level) {
        var logger = log4js.getLogger(name);
        //默认为debug权限及以上
        logger.setLevel(levels[level] || levels['debug']);
        return logger;
    };
    
    exports.use = function (app, level) {
      //加载中间件
        app.use(log4js.connectLogger(log4js.getLogger('logInfo'), {
            level: levels[level] || levels['debug'],
          //格式化http相关信息
            format: ':method :url :status'
        }));
    };
    
    

    app.js使用中间件

    var log4js = require('./config/logConfig.js');
    var app = express();
    log4js.use(app);
    

    index.js中使用log4js

    var express = require('express');
    var router = express.Router();
    //category名字为inde.js 只收录warn以及以上权限信息
    var logger = require('../config/logConfig.js').logger('index.js', 'warn');
    
    /* GET home page. */
    router.get('/', function (req, res, next) {
      //不显示
        console.log('This is an index page!');
        logger.trace('This is an index page! -- log4js');
        logger.debug('This is an index page! -- log4js');
        logger.info('This is an index page! -- log4js');
        logger.warn('This is an index page! -- log4js');
        logger.error('This is an index page! -- log4js');
        logger.fatal('This is an index page! -- log4js');
    
        res.render('index', {title: 'log4js'});
    });
    module.exports = router;
    
    

    4.2 需求二

    2.x版本的区别

    log4js.configure(...); // set up your categories and appenders
    const logger = log4js.getLogger('console');
    console.log = logger.info.bind(logger); // do the same for others - console.debug, etc.
    

    log

    暂缓

    参考列表

    Node.js 之 log4js 完全讲解
    log4js-Node.js中的日志管理模块使用与封装
    Log4js配置详解
    nodejs开发——log4js学习
    大搜车NodeJS日志规范化与分析监控
    基于node+express+log4js的前端异常信息监控
    node.js项目中使用log4js保存日志文件

    更多精彩内容请关注“IT实战联盟”哦~~~


    IT实战联盟.jpg

    相关文章

      网友评论

        本文标题:Nodejs log4js日志管理详解

        本文链接:https://www.haomeiwen.com/subject/eichextx.html