把日志保存在日志文件里
// app.js
var logger = require('morgan');
var fs = require('fs')
var logDirectory = path.join(__dirname, 'log')
fs.existsSync(logDirectory) || fs.mkdirSync(logDirectory)
var accesLogStream = FileStreamRotator.getStream({
date_format: 'YYYYMMDD',
filename: path.join(logDirectory, 'access-%DATE%.log'),
frequency: 'daily',
verbose: false
})
app.use(logger(logger.compile(`[joke] :req[User-Agent] :req[Referer]`), {stream: accesLogStream}))
// 运行结果
// 使用 postman 请求几次
[joke] PostmanRuntime/7.15.2 -
[joke] PostmanRuntime/7.15.2 -
[joke] PostmanRuntime/7.15.2 -
[joke] PostmanRuntime/7.15.2 http://localhost:3000/dish
把日志保存在 mongodb 里
// models/log.js
let {Schame} = {require('mongoose')}
let Log = new Schema({
userAgent: {
type: String,
default: ''
},
referrer: {
type: String,
default: ''
}
})
modole.exports = mongoose.model('Log', Log)
// app.js
var logger = require('morgan');
var log = require('./models/log.js')
var writeToDB = {write: function (line) {var [, ua, re] = line.split(' ')
var ele = new Log({
userAgent: ua,
referrer: re
})
ele.save(err => {if (err) {console.log('err', err)
}
})
}
}
/*
morgan 的源码是这样写的
stream.write(line + '\n')
所以为 morgan 指定的 stream 属性值的 write 属性是把日志保存到数据的方法
*/
app.use(logger(logger.compile(`[joke] :req[User-Agent] :req[Referer]`), {stream: writeToDB}))
记录一个 bug
把日志写入 mongodb 时报如下错误:'E11000 duplicate key error collection: confusion.logs index: userAgent_1 dup key: {: null}'
我在网上找的解决方法是 db.addresses.createIndex({ "xmpp_id": 1}, {sparse: true} )
当时看不懂。用了一个很暴力的方法解决的这个问题。方法如下:
- 打开 mongodb 的 compass,打开相应的 collection 的 Indexes 面板。把报错信息里的 index 删除了。
- 再打开相应的 collection 的 Documents 面板。把没有报错信息里的 index 的文档删除了。(不是万不得已不要使用这种方法!!!)