会logging要求个别良好的做法或混乱?

我正在开发一个API,它会进行大量的调用,其中一些需要由于各种原因被彻底logging。

现在,我logging了在函数中发生的所有input/输出/处理,并且API完美地工作,所以似乎没有必要增加日志logging的数量。

但是,一个想法是我的头脑后面的一个想法是分配一个UUID到每个传入的API调用,这将遵循logging在内部function。

虽然它会创build相当数量的追加参数来跟踪每个函数中的UUID,但是我想知道这是否是常见的做法,并且如果在需要出现之前应该执行它,并且要做的更改的数量是可pipe理的。

例如:

显然,真正的代码要复杂得多,并且不使用console.log进行日志logging

 const express = require('express'), fs = require('fs'), config = require('./config.json'), app = express(); function foo(bar, callback) { console.log(bar); fs.open(bar, (err, data) => { if(err) { console.err(err); callback(err); } else { console.log(data) callback(null, data); } }); } app.get('/foo', (req, res) => { console.log(req.body); foo(req.body.bar, (err, result) => { if(err) { console.err(err); res.send(err); } else { console.log(result) res.send(null, result); } }); }); app.listen(config.port); 

至:

 const express = require('express'), UUID = require('uuid-generator'), fs = require('fs'), config = require('./config.json'), app = express(); function foo(uuid, bar, callback) { console.log(uuid + ': ' + bar); fs.open(bar, (err, data) => { if(err) { console.err(uuid + ': ' + err); callback(err); } else { console.log(uuid + ': ' + data) callback(null, data); } }); } app.use((req, res, next) => { req.id = new UUID(); next(); }); app.get('/foo', (req, res) => { console.log(req.id + ': ' + req.body); foo(req.id, req.body.bar, (err, result) => { if(err) { console.err(req.id + ': ' + err); res.send(err); } else { console.log(req.id + ': ' + result) res.send(null, result); } }); }); app.listen(config.port); 

亲会是,如果一个function失败,或在系统崩溃的情况下,我们可以确切地确定哪个通话造成的错误,以及哪个path更容易跟随。

可以肯定的是,它需要一个不可忽视的数量的工作来实现,而且可能不是那么有用,因为我们已经可以推导出不同的input/输出和其他已经实现的logging的path。

TL:DR :通常的做法是以这样的粒度级别logging每个请求,还是为特定用例保留?

有没有什么工具可以自动化,我不应该在代码中关心它?

我不能真正评论这是否是一般的惯例,但对于我最近所做的产品来说,这是相当普遍的做法。

根据用例,我可以看到在通过系统跟踪单个请求方面有很多价值。 高stream量的API倾向于从中受益,就像由微服务组成的系统一样,您可能需要通过数字连接服务来跟踪请求。

例如,如果您有一个需要存储input的API,将特定input数据关联到发生故障的数据库写入可能非常有用。

如果您决定要将UUID添加到您的请求中,则express-request-id中间件是一个有用的模块,它会为您生成一个UUID,并将其添加到响应标头中。 它也可以接收一个UUID(如果在传入的请求头上)并使用它,这对于在服务之间跟踪请求很有用。

我还没有看到任何节点,将抽象logging个人要求完全离开,但我没有find。

logging请求,但不loggingstdout / stderr或文件是个好习惯。 最好的方法是通过TCP套接字将它发送到像Logz.io或自己的Logstash实例(可以安装在相同或不同的机器上)。 应该将Logstash连接到托pipe的AWS Elasticsearch服务或者本地或远程机器上安装的服务。 如果日志量不是很大,可以使用docker-compose快速地组装(对于高吞吐量,我推荐使用专门的资源丰富的服务器)

ELK Stack是一个非常棒的工具集,用于监视,日志聚合,优化的查询,以便通过成千上万的日志条目查找特定的请求和详细信息。 它是面向search的nosql数据库,已经几乎成为业界最先进的日志聚合工具之一。

Logstash通过不同的协议接收日志,将它们发送到NoSQL Elasticsearch,然后您可以使用Kibana前端浏览,构build仪表板并聚合日志数据。

有一个原因是已经build议添加X-Request-Id头,其他基础设施元数据添加到您的日志和时间指标。

这是允许你在本地机器上设置整个ELK工具集的项目 https://github.com/deviantony/docker-elk

logging可以在以下帮助下完成: – https://www.npmjs.com/package/winston (使用https://www.npmjs.com/package/winston-logstash ) – https://www.npmjs.com / package / bunyan (使用https://www.npmjs.com/package/bunyan-logstash

这两个库都有大量的其他types的日志logging插件

  1. 你看着摩根吗? 在文件,db等中logging每个请求的是快递中间件。可能甚至可以将日志logging到logstash。

  2. 现在,不是将UUID作为单独的parameter passing给每个函数,而是将其传递给传递给每个函数的现有数据json。

我认为你应该改变你的代码在每个日志消息中包含uuid,因为它将非常有助于你在基于uuid的大型日志文件中关注特定请求的踪迹。

希望能帮助到你。