nodejs中日志的使用

morgan中间件

控制台输出

     在进行nodejs的express进行开发的时候,一般使用了生成器的话,生成器默认会使用morgan中间件来记录请求信息。但是在使用app.use(logger('dev'));的时候,只会将请求信息打印到控制台,虽然这样方便调试,但是在实际的生产中,日志通常都会记录在日志文件中。具体如下:

const logger = require('morgan');
app.use(logger('dev'));

日志记录:

单一文件记录:

var express = require('express');
var fs = require('fs');
var logger = require('morgan');
 
var app = express();
 
// create a write stream (in append mode) 
var accessLogStream = fs.createWriteStream(__dirname + '/access.log', {flags: 'a'});
 
// setup the logger 
app.use(logger('combined', {stream: accessLogStream}));
 
app.get('/', function (req, res) {
    res.send('hello, world!');
});

日期文件记录:

    在日期记录的时候,需要配置file-stream-rotator模块来生产日志文件。

var FileStreamRotator = require('file-stream-rotator');
var express = require('express');
var fs = require('fs');
var logger = require('morgan');
 
var app = express();
var logDirectory = __dirname + '/logs';
 
// ensure log directory exists 
fs.existsSync(logDirectory) || fs.mkdirSync(logDirectory);
 
// create a rotating write stream 
var accessLogStream = FileStreamRotator.getStream({
     filename: `${logDirectory}/access.-%DATE%.log`,
  frequency: 'daily',
  verbose: false,
  date_format:'YYYYMMDD'
});
 
// setup the logger 
app.use(logger('combined', {stream: accessLogStream}));
 
app.get('/', function (req, res) {
    res.send('hello, world!');
});

log4js记录操作日志

上面已经说过了mogan是用来记录请求信息的中间件,而log4js记录的则是在框架中任何能够产生有用信息(正确的输出和错误的记录)的。在使用log2js记录日志的时候。网上百度出来的都是log4js版本为1.0以下的,我以前在项目中使用的也是1.0以下的版本,非常好配置,具体如下。

const log4js = require('log4js');
let options = {
	appenders: [
        {
            type: "dateFile",
            filename: 'info',
            pattern: "-yyyyMMdd.log",
            alwaysIncludePattern: true,//如果为true,则每个文件都会按pattern命名,否则最新的文件不会按照pattern命名
            compress : true,//以压缩的形式保存新文件
            category: 'info'
        },
        {
            type: "dateFile",
            filename: 'errorInfo',
            pattern: "-yyyyMMdd.log",
            alwaysIncludePattern: true,
            compress : true,
            category: 'error'
        },
    ],
    replaceConsole: false,   //替换console.log
}
log4js.configure(options);

let infoLog = log4js.getLogger('info');
let errorLog = log4js.getLogger('error');

//test
infoLog.trace('This is a Log4js-Test');
infoLog.debug('We Write Logs with log4js');
infoLog.info('You can find logs-files in the log-dir');
infoLog.warn('log-dir is a configuration-item in the log4js.json');
infoLog.error('In This Test log-dir is : \'./logs/log_test/\'');


//自己输出日志的封装,封装日志等级的各种方法,然后在调用不同的方法将日志输出到文件中。
let Log = {
    trace: function () {
        infoLog.trace.apply(infoLog, arguments)
    },
    debug: function () {
        infoLog.debug.apply(infoLog, arguments)
    },
    info: function () {
        infoLog.info.apply(infoLog, arguments)
    },
    log: function log() {
        infoLog.info.apply(infoLog, arguments)
    },
    warn: function () {
        infoLog.warn.apply(infoLog, arguments)
    },
    error: function error() {
        infoLog.error.apply(infoLog, arguments)
        errorLog.error.apply(errorLog, arguments)
    },
    fatal: function () {
        infoLog.fatal.apply(infoLog, arguments)
        errorLog.fatal.apply(errorLog, arguments)
    }
}

在上面的配置中比较不错的参考博文:

https://www.cnblogs.com/duhuo/p/5176154.html

http://blog.fens.me/nodejs-log4js/

上面是1.0版本以下或者是3.05以下版本的写法,项目中更新到3.05版本后,上面的配置都失效了,本来以为网上随便百度下,就能收到3.05版本的配置方法,无奈搜了好一会,并没有,看着好多人的博客都是写着原创,实则内容都是一样的,感觉怪怪的,无奈还是自己配置吧。有了上一次配置的经验,更新下版本估计也不是啥难题,我就去github上看了下源码,具体的配置如下。可能某些地方我也不太懂,毕竟看一份源码非常浪费时间。只能看着源码吧自己想要的效果配置出来,满足自己的项目需求即可。git地址:https://github.com/log4js-node/log4js-node。有兴趣的人可以去看看,我的具体配置如下:

const log4js = require('log4js');

let options = {
    "appenders": {
        "console":{
          "type":"console"
        },
        "info": {
          "type": "dateFile",
          "filename": 'logFilename',
          "pattern": "-yyyy-MM-dd.log",
          "alwaysIncludePattern": true,//如果为true,则每个文件都会按pattern命名,否则最新的文件不会按照pattern命名
        },
        "errors": {
          "type": "dateFile",
          "filename": 'errorFilename',
          "pattern": "-yyyy-MM-dd.log",
          "alwaysIncludePattern": true,//如果为true,则每个文件都会按pattern命名,否则最新的文件不会按照pattern命名
           "maxLogSize": 10485760,
          "numBackups": 3
        }
      },
      "categories": {
        "default":{ "appenders": ["info","errors","console"], "level": "info" },
        "info": { "appenders": [ "info"], "level": "info" },
        "errors": { "appenders": [ "errors" ], "level": "info" },//level:trace,debug,info,warn,error,fatal
        "console":{ "appenders": [ "console" ], "level": log4js.levels.ALL }
      }
};
log4js.configure(options);


let errorsLog = log4js.getLogger('errors');
let infoLog = log4js.getLogger('info');
let consoleLog = log4js.getLogger('console');

let Log = {
  trace: function () {
      infoLog.trace.apply(infoLog, arguments);
  },
  debug: function () {
      infoLog.debug.apply(infoLog, arguments)
  },
  info: function () {
      infoLog.info.apply(infoLog, arguments)
  },
  log: function log() {
      infoLog.info.apply(infoLog, arguments)
  },
  warn: function () {
      infoLog.warn.apply(infoLog, arguments)
  },
  error: function error() {
      infoLog.error.apply(infoLog, arguments)
      errorLog.error.apply(errorLog, arguments)
  },
  fatal: function () {
      infoLog.fatal.apply(infoLog, arguments)
      errorLog.fatal.apply(errorLog, arguments)
  }
}
if(!! CONFIG.get('env.debug')) {
  Log.log = function () {
      infoLog.info.apply(infoLog, arguments)
      consoleLog.info.apply(consoleLog, arguments)
  }
  Log.error = function () {
      infoLog.error.apply(infoLog, arguments)
      errorLog.error.apply(errorLog, arguments)
      consoleLog.info.apply(consoleLog, arguments)
  }
}

仔细看过的同学应该都能看出来,配置的东西都是大同小异。所以以后在更新自己学习的知识的时候,希望大家都能按照一个思想来,一个东西再怎么升级,该有的逻辑是不会变的,变的只是语法和形式而已。自己把握住中心即可。

猜你喜欢

转载自blog.csdn.net/swimming_in_IT_/article/details/82777264