zoukankan      html  css  js  c++  java
  • node 日志管理log4js

    node 日志管理log4js

    一、默认的控制台输出

    我们使用express框架时,开发模式用node或者supervisor启动nodejs应用时,控制台都是显示如下的日志。

    GET /css/bootstrap.min.css 304 1ms
    GET /css/my.css 304 0ms
    GET /js/bootstrap.min.js 304 4ms
    GET /js/jquery-1.9.1.min.js 304 6ms
    GET /js/holder.js 304 3ms
    GET /cat/json/latest 200 6ms
    GET /cat/json/master 200 4ms
    GET /cat/json/classic 200 2ms
    GET /about 200 6ms
    GET /css/bootstrap.min.css 304 2ms
    GET /css/my.css 304 2ms
    GET /js/bootstrap.min.js 304 2ms
    GET /js/jquery-1.9.1.min.js 304 1ms
    GET /js/holder.js 304 1ms
    GET /js/bootstrap.min.js 304 1ms
    GET / 304 6ms
    GET /js/jquery-1.9.1.min.js 304 2ms
    GET /css/my.css 304 1ms
    GET /css/bootstrap.min.css 304 1ms
    GET /js/bootstrap.min.js 304 2ms
    GET /js/holder.js 304 2ms
    GET /cat/json/latest 200 3ms
    GET /cat/json/master 200 2ms
    GET /cat/json/classic 200 2ms
    GET /admin/ 304 13ms
    GET /css/bootstrap.min.css 304 3ms
    GET /js/jquery-1.9.1.min.js 304 2ms
    GET /css/my.css 304 2ms
    GET /js/bootstrap.min.js 304 1ms
    GET /js/holder.js 304 2ms

    我们也可以在代码中,用console.log()打印一些控制台日志。

    修改routes/index.js

    exports.index = function(req, res){
    console.log("This is an index page!");
    res.render('index', {
            title:'首页|moive.me',
            page:'index'
        });
    };

    访问页面,结果如下:

    This is an index page!
    GET / 304 19ms
    GET /css/bootstrap.min.css 304 4ms
    GET /css/my.css 304 2ms
    GET /js/jquery-1.9.1.min.js 304 38ms
    GET /js/holder.js 304 29ms
    GET /js/bootstrap.min.js 304 28ms

    这样的输出的结果,都是在控制台显示,一旦server重启日志就丢失了。对于程序开发来说,这样的输出已经够用了。但是在生产环境上,我们希望能把控制台的输出,保存到文件中,而且需要更多的信息,不仅仅是默认的简化的日志信息。

    由于express框架没有日志功能,我们需要引入log4js包来完成这个功能。

    二、配置log4js与express框架集成

    1、安装

    npm install log4js
    

    2、修改项目入口配置文件,如日志分析项目express.js

    var log4js = require('log4js');
    log4js.configure({
      appenders: [
        { type: 'console' }, //控制台输出
        {
          type: 'file', //文件输出
          filename: 'logs/log.log', 
          maxLogSize: 1024,
          backups:3,
          category: 'normal' 
        }
      ]
    });
    var logger = log4js.getLogger('normal');
    logger.setLevel('INFO');
    ...
    
    app.use(log4js.connectLogger(logger, {level:log4js.levels.INFO}));
    app.use(app.router);

    需要在express.js中进行log4js的配置。 appenders中配置了两个输出,一个是控制台输出,一个是文件输出。

    appenders.type=file的对象,指定文件输出位置及文件大小,当超过maxLogSize大小时,会自动生成一个新文件。logs的文件目录要动手创建。 level:log4js.levels.INFO, 设置默认日志输出级别是INFO。

    log4js的输出级别6个: trace, debug, info, warn, error, fatal

    • logger.trace(‘Entering cheese testing’);
    • logger.debug(‘Got cheese.’);
    • logger.info(‘Cheese is Gouda.’);
    • logger.warn(‘Cheese is quite smelly.’);
    • logger.error(‘Cheese is too ripe!’);
    • logger.fatal(‘Cheese was breeding ground for listeria.’);

    如果输出级别是INFO,则不会打印出低于info级别的日志trace,debug,只打印info,warn,error,fatal。这样做 的好处在于,在生产环境中我们可能只关心异常和错误,并不关心调试信息。从而大大减少日志的输出,能减少磁盘写入。而在开发环境中,我们可以需要打印非常 多的信息,帮助开发人员定位错误,调试代码。

    还有一个好处就是,代码中可以混有各种的日志打印代码。我们只要在一个配置文件中,修改输出级别,日志输出就会发生变化,不用修改所有的代码。如果所有地方都是console.log(),那么上线的时候,改动这个东西就要花很多时间。

    三、根据项目配置log4js

    1. 增加replaceConsole代替console.log() 增加replaceConsole配置,让所有console输出到日志中,以[INFO] console代替console默认样式。

       var log4js = require('log4js');
       log4js.configure({
         appenders: [
           { type: 'console' },{
             type: 'file', 
             filename: 'logs/log.log', 
             maxLogSize: 1024,
             backups:4,
             category: 'normal' 
           }
         ],
         replaceConsole: true
       });
    2. 调整日志输出的格式

       app.use(log4js.connectLogger(logger, {level: 
       level:log4js.levels.INFO, format:':method :url'}));
    3. 自动调整日志输出级别

       日志级别对应规则:
       http responses 3xx, level = WARN
       http responses 4xx & 5xx, level = ERROR
       else, level = INFO  

      设置level为auto:

        app.use(log4js.connectLogger(logger, {level: 'auto', format:':method :url'}));

    四、调整log4js结构

    我们在配置log4js时会有一个问题。就是以上所有配置信息都是在express.js中做的,logger也是在这里直接定义的。如果在控制器(routes)想用log4js进行输出,我们现在拿不到logger的句柄。

    新建立log.js

    var log4js = require('log4js');
    
    log4js.configure({
    
        appenders: [
            {
                type: 'console',
                category: "console"
    
            }, //控制台输出
            {
                type: "file",
                filename: 'logs/log.log',
                pattern: "_yyyy-MM-dd",
                maxLogSize: 20480,
                backups: 3,
                category: 'dateFileLog'
    
            }//日期文件格式
        ],
        replaceConsole: true,   //替换console.log
        levels:{
            dateFileLog: 'debug',
            console: 'debug'
        }
    });
    
    
    var dateFileLog = log4js.getLogger('dateFileLog');
    var consoleLog = log4js.getLogger('console');
    exports.logger = consoleLog;
    
    
    exports.use = function(app) {
        app.use(log4js.connectLogger(consoleLog, {level:'INFO', format:':method :url'}));
    }

    我们把logger单独定义出来,并且做为API暴露出来,此处是开发调试,没有使用文件输出。 这样在其他模块中使用logger输出日志只需如下操作:

    var logger = require('../../log').logger;
    logger.debug("collectTime=%s",collectTime);

    样我们就已经玩转log4js了,如果部署生产需要文件输出只要修改log.js中dateFileLog级别,然后设置exports.logger=dateFileLog即可。

    原文地址:http://www.blogways.net/blog/2014/06/09/node-log4js.html, 感谢原作者分享。

  • 相关阅读:
    办公自动化12-word批量替换(将替换内容写在excel里)
    办公自动化11-把word里所有的分节符替换为分页符
    办公自动化10-合并多个word文件
    办公自动化9-批量word转pdf
    办公自动化8-单个pdf转txt
    python3安装docx模块出现Import Error: No module named 'exceptions'
    办公自动化7-Rename批量修改文件名称(实现自动编号)
    办公自动化6-OS库基本操作
    线性空间
    二重积分
  • 原文地址:https://www.cnblogs.com/Joans/p/4092293.html
Copyright © 2011-2022 走看看