Add a unique id to each request made to your server and track your users' activity in the logs.
- Add a unique
request id
andcorrelation id
to each request. - Automatically log the
request id
andcorrelation id
when a message is logged.
Strapi v4 is required.
Join the Discord Community to give your feedback.
- Download
yarn add strapi-plugin-request-id
or
npm i strapi-plugin-request-id
- Enable the plugin
In config/plugins.js
, add:
module.exports = ({ env }) => ({
//...
"request-id": {
enabled: true,
},
//...
});
- Add the
request-id
middleware:
In config/middlewares.js
, add the middleware at the bottom of the list:
module.exports = [
//...
"plugin::request-id.request-id",
];
When a request is received, a unique request id
and correlation id
are added to it.
These ids have different meanings:
request id
: Used to track a user's actions on the server only. Each time a request is received, a newrequest id
is generated, even if the associated header is set.correlation id
: Used to track a user's actions across multiple services. Thecorrelation id
is either set from the headers of the request or generated if none is provided.
☝️ If the header of the request contains the property
X-Correlation-Id
, this value is used as thecorrelation id
instead generating a new one.
In config/plugins.js
:
module.exports = ({ env }) => ({
//...
"request-id": {
enabled: true,
config: {
/**
* Define the header to use to get/set the correlation id.
*/
correlationIdHeader: "X-Amzn-Trace-Id", // default: "X-Correlation-Id".
},
},
//...
});
/**
* Get the service "request-id".
*/
strapi.plugin("request-id").service("request-id");
/**
* Get the correlation id of the request.
*/
getCorrelationId(): string;
/**
* Get the request id of the request.
*/
getRequestId(): string;
The request id
and correlation id
are automatically logged when a message is logged using the strapi logger.
This code:
const endpoint = (ctx) => {
const { user } = ctx.state;
strapi.log.info(`user ${user.id} was there!`);
ctx.status = 200;
};
Will produce the logs:
{
"level": "info",
"message": "user 1 was there!",
"timestamp": "2022-05-29 17:26:19",
"x-correlation-id": "e5b97199-9003-4c36-8ead-28186e3f4a4f",
"x-request-id": "04dd66c9-3d3e-4188-8ae8-32703d864862"
}
You can then track user 1
's activity by filtering the logs with x-request-id="04dd66c9-3d3e-4188-8ae8-32703d864862"
, or accross your services using x-correlation-id
.
By default, strapi doesn't display the logs as json in the console. If you want to see the request id
and correlation id
while developing, create the file config/logger.js
and use this configuration:
const { winston } = require("@strapi/logger");
module.exports = {
transports: [
new winston.transports.Console({
level: "silly",
format: winston.format.combine(
winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
winston.format.json()
),
}),
],
};
The request id
and correlation id
are added to the headers of the response. They can be accessed through the ctx.response
object:
const endpoint = (ctx) => {
const requestIdService = strapi.plugin("request-id").service("request-id");
const requestId = requestIdService.getRequestId();
const correlationId = requestIdService.getCorrelationId();
const res = await fetch(`my-other-service/endpoint`, {
method: "GET",
headers: {
// Add the correlation id when calling an external service.
"X-Correlation-Id": correlationId
},
});
ctx.body = { data: res.data };
};
By default, the correlation id
is associated to the header X-Correlation-Id
. It is configurable:
In config/plugins.js
:
module.exports = ({ env }) => ({
//...
"request-id": {
enabled: true,
config: {
correlationIdHeader: "X-Amzn-Trace-Id",
},
},
//...
});
Now, let's say the server received a request with the header "X-Amzn-Trace-Id": "my-custom-trace-id"
. It will produce the logs:
{
"level": "info",
"message": "user 1 was there!",
"timestamp": "2022-05-29 17:26:19",
"x-amzn-trace-id": "my-custom-trace-id",
"x-request-id": "04dd66c9-3d3e-4188-8ae8-32703d864862"
}
The response will also have the header "X-Amzn-Trace-Id": "my-custom-trace-id"
.
- Strapi Plugin Import Export Entries: Import/Export data from and to your database in just few clicks
Baboo - @Baboo7