【问题标题】:Store morgan logs into database将摩根日志存储到数据库中
【发布时间】:2018-10-19 05:30:23
【问题描述】:

我正在使用morgan('dev') 进行日志记录,但我想将此对象"GET /users/get 200 195.315 ms - 393" [在控制台日志中] 存储到数据库中。

喜欢

- method : get 
- endpoint : /users/get
- status : 200

我怎样才能得到这个对象?
如何在数据库上面的字段(方法、端点、状态)中爆炸和插入数据?

【问题讨论】:

    标签: javascript node.js express morgan


    【解决方案1】:

    您可以创建一个小型中间件,用于监听'finish' Response 事件并将数据保存到数据库中:

    app.use((req, res, next) => {
      const method = req.method;
      const endpoint = req.originalUrl;
    
      res.on('finish', () => {
       const status = res.status;
       saveRequestDataToDatabase(method, endpoint, status);
       next();
      });
    });
    

    【讨论】:

    • 好的,如果我想存储请求正文和对字段的响应怎么办?如何获得?
    • 如果您使用的是bodyparser,那么您可以像req.body 一样访问请求的正文。获取 Response 的主体并不容易,因为 Response 是一个Stream。通常检索 Response 的主体是通过猴子修补 response.writeresponse.end 方法来完成的。你可以看看它是如何实现的herehere
    【解决方案2】:

    已经有一些模块可以为已知存储提供流兼容接口,例如 Mongoose-Morgan,它允许您将 Mongoose 日志直接流式传输到 MongoDB。但是,如果您找不到与 morgan 兼容的模块,您可以简单地编写一个返回可写流并将信息发送到您需要的地方的函数。 Morgan NPM Logger – The Beginner’s Guide

    创建一个新的命名格式:

    const morgan = require('morgan')
    const Writable = require("stream").Writable
    morgan.token("custom", "-method: :method -endpoint: :url -status: status")
    

    按名称使用新格式:

     class MyStream extends Writable {
        write(line) {
        //here you send the log line to wherever you need
           console.log("Logger:: ", line)
        }
      }
      let writer = new MyStream()
     
     app.use(morgan(‘custom’, {stream: write}))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 2019-04-04
      • 2014-12-03
      • 1970-01-01
      相关资源
      最近更新 更多