【问题标题】:What's the best practice for expressjs logging?expressjs 日志记录的最佳实践是什么?
【发布时间】:2013-11-19 01:57:13
【问题描述】:

我正在构建一个基于 expressjs 的应用程序,我想在其中记录所有事件。我可以找到温斯顿,这似乎很酷。无论如何,我正在寻找一种将它连接到我的 expressjs 应用程序的方法。

我还想要在应用程序中登录。我的请求不是那么简单,所以我想记录我的应用程序中的所有内容(不仅仅是请求)。

我现在的情况:

server.js(我想在这个级别记录 http 请求)

var express = require('express');
var app = express();
var fs = require('fs');

// Post parser
app.configure(function(){
    app.use(express.bodyParser());
});

// Load routes
require('fs').readdirSync(__dirname + '/routes').forEach(function(file) {
    require(__dirname + '/routes/' + file)(app);
});

// 404: Not found
app.use(function(req, res, next){
    res.json(404, {ERROR: 'Page not found.'});
});

// 500: Error reporing
app.use(function(err, req, res, next){
    console.error(err.stack);
    res.json(500, {ERROR: 'Internal server error.'} );
});

// Startup new server
app.listen(900);

routes/something.js

var something = require(__dirname + '/../controller/something.js');

module.exports = function(app) {
    app.get('/v1/something', function(req, res, next) { new something().getAll(req, res, next); });
};

controller/something.js(我想使用同一个记录器进行调试记录)

/**
 * Constructor
 *
 */
function Something() {
};

/**
 * Get all the data
 *
 */
Something.prototype.getAll = function(req, res, next) {
    // I want to log some very important information here
    res.json({result: true, data: ['hello', 'hi', 'ciao', 'buf']});
}

module.exports = Something;

我正在考虑的另一件事是将所有事件记录在从控制器(例如模型或其他库)调用的函数中。

所以我认为,创建一些记录器库的好方法可能是:

var logger = require(__dirname + '/../libraries/logger.js');

包含记录器定义。我不知道如何解决的另一个问题是如何为数据添加前缀。你知道,我有很多并发请求,我想看看每个请求调用了哪个调试消息。

【问题讨论】:

    标签: node.js logging express


    【解决方案1】:

    我喜欢Hirung103 的回答,所以这里是javascript 版本:

    首先,如果package.json 中未列出这些库,请添加express-request-idmorgan

    然后在您的server.js 中添加这些行:

    ...
    const addRequestId = require('express-request-id')({
      setHeader: false
    })
    
    app.use(addRequestId)
    
    const morgan = require('morgan')
    
    morgan.token('id', (req) => {
      req.id.split('-')[0]
    })
    
    app.use(
      morgan(
        "[:date[iso] #:id] Started :method :url for :remote-addr",
        {
          immediate: true
        }
      )
    )
    ...
    

    感谢Hirung103

    【讨论】:

      【解决方案2】:

      我喜欢以下 Rails 风格的日志记录:

      [2017-11-02T11:13:54.545 #07738a81] Started GET /api/url for 10.0.0.1
      [2017-11-02T11:13:54.550 #07738a81] Completed 200 31739 in 5.635 ms
      

      下面的代码就是这样做的

      addRequestId = require('express-request-id')(setHeader: false)
      app.use(addRequestId)
      
      morgan = require('morgan')
      morgan.token('id', (req) -> req.id.split('-')[0])
      
      app.use(morgan(
        "[:date[iso] #:id] Started :method :url for :remote-addr",
        immediate: true))
      
      app.use(morgan("
        [:date[iso] #:id] Completed :status :res[content-length] in :response-time ms"))
      
      app.use('/api', router)
      

      【讨论】:

      • 读者注意,这是 Coffeescript(细箭头)
      【解决方案3】:

      我们使用winston,它可能是目前最强大的日志记录包。

      我们最终按照您的建议进行了设置。创建一个通用库,用于将记录器对象包装在我们的定义和传输中,然后处理我们希望以不同方式处理的任何其他类型的对象。

      https://gist.github.com/rtgibbons/7354879

      【讨论】:

      • 您是记录到文件还是数据库?
      • 目前我们登录到一个文件。使用 logrotate 管理旧日志。我们正在使用 Loggly 传输进行测试
      【解决方案4】:

      如果您使用的是 express,您可能需要查看 express-winston 包。然后你可以使用winston作为中间件并轻松记录请求/错误,而不会让你的代码变得混乱......

      【讨论】:

      • 谢谢,我之前发现了这个,我认为它非常有用。但是,它很容易用作 http 请求记录器,但我也想在应用程序中使用它。
      • 您可以将自己的记录器传递给 express-winston:app.use(expressWinston.logger({ transports: [ myLogger ] }));
      • expressjs 现在默认配备了 morgan 模块。当您触发express-generator 呼叫时
      猜你喜欢
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 2018-03-27
      • 2021-08-05
      • 2010-10-08
      相关资源
      最近更新 更多