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