Node.js 如何在Express中进行标记登录

Node.js 如何在Express中进行标记登录,node.js,express,Node.js,Express,请求的日志如下所示: Received a new product Widget-1 Started to store product POST /products 200 52.240 ms - 2 Product stored 其中第一、第二和第四行是我使用console.log创建的日志。第三个是由摩根完成的 我的问题是,在数据库中存储产品的(异步)函数相对较慢,所以我有这样的日志 Received a new product Widget-1 Started to store prod

请求的日志如下所示:

Received a new product Widget-1
Started to store product
POST /products 200 52.240 ms - 2
Product stored
其中第一、第二和第四行是我使用console.log创建的日志。第三个是由摩根完成的

我的问题是,在数据库中存储产品的(异步)函数相对较慢,所以我有这样的日志

Received a new product Widget-1
Started to store product
POST /products 200 52.240 ms - 2
Received a new product Widget-2
Started to store product
POST /products 200 52.240 ms - 2
Product stored
Product stored
如何标记每个日志行,以便轻松地对请求的日志进行分组?差不多

[11111] Received a new product Widget-1
[11111] Started to store product
[11111] POST /products 200 52.240 ms - 2
[aaaaa] Received a new product Widget-2
[aaaaa] Started to store product
[aaaaa] POST /products 200 52.240 ms - 2
[11111] Product stored
[aaaaa] Product stored
标记可以是任何格式,我只想过滤属于同一请求的行

我在Express中尝试了这一点,创建了一个中间件,为req.id分配了一个随机数,并在每个console.log中使用该数字,例如:

console.log(`[${req.id}] Started to store product`)

但我更愿意在中间件或配置中定义标记,然后使用
console.log(“开始存储产品”)
将唯一ID附加到req是正确的方向。
更进一步,我们可以将
log()
函数附加到req,该函数将记录以
req.id
为前缀的任何内容

这给了我们:

const myMiddleware = (req, res, next) => {
  req.id = getUniqueId();
  req.log = (...args) => console.log(`[${req.id}]`, ...args);
};
。。。以及以后使用:

// later
req.log('Started to store product'); // Outputs `[123456] Started to store product`


关于您希望Morgan日志也被标记的事实,除非Morgan可以提供一个自定义日志功能,否则不可能根据每个请求对其进行标记。

将唯一ID附加到req是正确的方向。
更进一步,我们可以将
log()
函数附加到req,该函数将记录以
req.id
为前缀的任何内容

这给了我们:

const myMiddleware = (req, res, next) => {
  req.id = getUniqueId();
  req.log = (...args) => console.log(`[${req.id}]`, ...args);
};
。。。以及以后使用:

// later
req.log('Started to store product'); // Outputs `[123456] Started to store product`


关于您希望对Morgan日志也进行标记的事实,除非Morgan可以提供自定义日志功能,否则无法按请求对其进行标记。

我创建了一个库,专门用于启用此功能

当您使用涂鸦时。在你的应用程序中,你调用scribbles logger的任何地方都会根据父请求自动标记输出

  • 根据您的要求,我更改了输出的格式字符串
spanId
包含一个缩短的1)当前提交哈希2)父ID 3)进程ID和4)请求数。这意味着您可以仅基于此
spanId
分离请求(通过日志收集器中的某些正则表达式),同时还可以获得一些有用的基本信息

const scribbles = require('scribbles');
const express   = require('express');

scribbles.config({
   format:'{time} [{spanId}] <{logLevel}> {fileName}:{lineNumber} {message}'
})

const app = express();

// start a trace for each incoming request.
app.use(scribbles.middleware.express);

app.get('/', function (req, res){

  scribbles.log("incoming");
  // 2022-06-27T16:24:06.473 [090e8e40000005] <log> index.js:17 incoming

  // ... do some work

}) // END app.get '/'


app.listen(port, () => scribbles.status(`App is ready!`))
const scribbles=require('scribbles');
const express=require('express');
scribbles.config({
格式:“{time}[{spanId}]{fileName}:{lineNumber}{message}”
})
常量app=express();
//为每个传入请求启动跟踪。
app.use(scribbles.middleware.express);
app.get('/',函数(req,res){
scribbles.log(“传入”);
//2022-06-27T16:24:06.473[090E8E400005]index.js:17传入
//…做些工作
})//结束app.get'/'
app.listen(端口,()=>scribbles.status(`app is ready!`))

涂鸦在帮助记录事件方面可以做得更多。为了了解性能监控和跨微服务的分布式跟踪,我创建了一个库,专门用于实现这一功能

当您使用涂鸦时。在你的应用程序中,你调用scribbles logger的任何地方都会根据父请求自动标记输出

  • 根据您的要求,我更改了输出的格式字符串
spanId
包含一个缩短的1)当前提交哈希2)父ID 3)进程ID和4)请求数。这意味着您可以仅基于此
spanId
分离请求(通过日志收集器中的某些正则表达式),同时还可以获得一些有用的基本信息

const scribbles = require('scribbles');
const express   = require('express');

scribbles.config({
   format:'{time} [{spanId}] <{logLevel}> {fileName}:{lineNumber} {message}'
})

const app = express();

// start a trace for each incoming request.
app.use(scribbles.middleware.express);

app.get('/', function (req, res){

  scribbles.log("incoming");
  // 2022-06-27T16:24:06.473 [090e8e40000005] <log> index.js:17 incoming

  // ... do some work

}) // END app.get '/'


app.listen(port, () => scribbles.status(`App is ready!`))
const scribbles=require('scribbles');
const express=require('express');
scribbles.config({
格式:“{time}[{spanId}]{fileName}:{lineNumber}{message}”
})
常量app=express();
//为每个传入请求启动跟踪。
app.use(scribbles.middleware.express);
app.get('/',函数(req,res){
scribbles.log(“传入”);
//2022-06-27T16:24:06.473[090E8E400005]index.js:17传入
//…做些工作
})//结束app.get'/'
app.listen(端口,()=>scribbles.status(`app is ready!`))

涂鸦在帮助记录事件方面可以做得更多。要了解有关性能监视和跨微服务的分布式跟踪的信息,您可能需要初始化一种事务,然后以特定的方式记录与此事务相关的所有内容(此处有一个ID)。我认为您对刚才所做的事情没有选择。看起来您想要初始化一种事务,然后以特定的方式记录与此事务相关的所有内容(此处有一个ID)。我想你别无选择。