记录请求单独进行良好操作还是混乱?

Dra*_*SAN 7 javascript logging node.js

我正在开发一个API,它会进行大量的调用,其中一些需要因各种原因进行彻底记录.

现在,我记录了函数中发生的所有输入/输出/处理,并且API完美运行,因此似乎不需要增加日志记录量.

但是我想到的一个想法就是为每个传入的API调用分配一个UUID,这将跟随内部函数的记录.

虽然它会在每个函数中创建相当多的附加参数来跟随UUID,但我想知道它是否是常见的做法,如果我应该在需要之前实现它,并且要做的更改量是可管理的.

例如:

显然,真正的代码要复杂得多,并且不console.log用于日志记录

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);
Run Code Online (Sandbox Code Playgroud)

至:

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);
Run Code Online (Sandbox Code Playgroud)

专家将是,如果功能失败,或者在系统崩溃的情况下,我们可以准确地识别哪个呼叫导致错误,以及更容易遵循哪个路径.

问题是,它需要一个不可忽略的工作量来实现,并且可能没那么有用,因为我们已经可以推断出不同输入/输出和已经实现的其他日志记录所遵循的路径.

TL:DR:通常的做法是以如此级别的粒度记录每个请求,还是保留用于特定用例?

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

小智 1

我无法真正评论这是否是普遍的做法,但在我最近开发的产品中,这是相当普遍的做法。

\n\n

根据用例,我可以看到通过系统跟踪单个请求有很多价值。高流量 API 往往会从中受益,由微服务组成的系统也是如此,您可能需要通过多个连接服务来跟踪请求。

\n\n

例如,如果您有一个 API 接受需要存储的输入,那么能够将特定输入数据与失败的数据库写入关联起来会非常有用。

\n\n

如果您决定确实要向请求添加 UUID,那么express-request-id中间件是一个有用的模块,它可以为您生成 UUID 并将其添加到响应标头中。如果传入请求标头中存在 UUID,它还可以使用该 UUID 来代替,这对于跟踪服务之间的请求非常有用。

\n\n

我\xe2\x80\x99还没有看到任何节点可以完全抽象记录单个请求,但我还没有\xe2\x80\x99t寻找它。

\n