mirror of
https://github.com/alexgo-io/xverse-stacks-transaction-sponsor.git
synced 2026-01-12 17:02:16 +08:00
feat: add pino for logging
This commit is contained in:
@@ -2,3 +2,4 @@ SEED="your sponsor wallet seed phrase"
|
|||||||
PASSWORD="sponsoredbyxverse"
|
PASSWORD="sponsoredbyxverse"
|
||||||
NUM_ADDRESSES=5
|
NUM_ADDRESSES=5
|
||||||
MAX_FEE=50000
|
MAX_FEE=50000
|
||||||
|
LOG_LEVEL=debug
|
||||||
|
|||||||
@@ -29,4 +29,5 @@ export default {
|
|||||||
maxFee: isEnvVarValid(
|
maxFee: isEnvVarValid(
|
||||||
process.env.MAX_FEE as string
|
process.env.MAX_FEE as string
|
||||||
),
|
),
|
||||||
|
logLevel: process.env.LOG_LEVEL || "info",
|
||||||
};
|
};
|
||||||
|
|||||||
808
package-lock.json
generated
808
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -23,7 +23,9 @@
|
|||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"dotenv": "^10.0.0",
|
"dotenv": "^10.0.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"node-cache": "^5.1.2"
|
"node-cache": "^5.1.2",
|
||||||
|
"pino": "^8.14.1",
|
||||||
|
"pino-pretty": "^10.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/cors": "^2.8.13",
|
"@types/cors": "^2.8.13",
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ initializeSponsorWallet();
|
|||||||
|
|
||||||
app.use(json());
|
app.use(json());
|
||||||
app.use(cors());
|
app.use(cors());
|
||||||
|
app.use(requestLogMiddleware);
|
||||||
|
|
||||||
app.get('/', (_: Request, res: Response) => {
|
app.get('/', (_: Request, res: Response) => {
|
||||||
res.send('Ok');
|
res.send('Ok');
|
||||||
@@ -34,7 +35,7 @@ app.use(errorHandler);
|
|||||||
app.use(wrongRouteHandler);
|
app.use(wrongRouteHandler);
|
||||||
|
|
||||||
const server = app.listen(port, () => {
|
const server = app.listen(port, () => {
|
||||||
console.log(
|
logger.info(
|
||||||
`Stacks Transaction Sponsor Web Service started and listening at http://localhost:${port} in ${app.get(
|
`Stacks Transaction Sponsor Web Service started and listening at http://localhost:${port} in ${app.get(
|
||||||
'env',
|
'env',
|
||||||
)} mode`,
|
)} mode`,
|
||||||
|
|||||||
67
src/logger.ts
Normal file
67
src/logger.ts
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
import { RequestHandler } from "express";
|
||||||
|
import pino, { Logger } from "pino";
|
||||||
|
import config from "../config/config";
|
||||||
|
|
||||||
|
let requestId = 0;
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-namespace
|
||||||
|
namespace Express {
|
||||||
|
// We extend the Express Request interface here to add custom properties which we'll inject with middleware
|
||||||
|
interface Request {
|
||||||
|
logger: Logger;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this for logging anything not in a request context, otherwise, use req.logger
|
||||||
|
*/
|
||||||
|
export const logger = pino({
|
||||||
|
enabled: process.env.NODE_ENV !== "test",
|
||||||
|
level: config.logLevel,
|
||||||
|
transport: {
|
||||||
|
target: "pino-pretty",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const requestLogMiddleware: RequestHandler = (req, res, next) => {
|
||||||
|
const requestLogger = logger.child({
|
||||||
|
requestId: requestId++,
|
||||||
|
});
|
||||||
|
|
||||||
|
req.logger = requestLogger;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const onResponseComplete = () => {
|
||||||
|
res.removeListener("close", onResponseComplete);
|
||||||
|
res.removeListener("finish", onResponseComplete);
|
||||||
|
res.removeListener("error", onResponseComplete);
|
||||||
|
|
||||||
|
const logMethod = res.statusCode >= 400 ? "warn" : "info";
|
||||||
|
|
||||||
|
req.logger[logMethod](
|
||||||
|
{
|
||||||
|
statusCode: res.statusCode,
|
||||||
|
host: req.hostname,
|
||||||
|
path: req.path,
|
||||||
|
method: req.method,
|
||||||
|
},
|
||||||
|
"request completed"
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
res.on("close", onResponseComplete);
|
||||||
|
res.on("finish", onResponseComplete);
|
||||||
|
res.on("error", onResponseComplete);
|
||||||
|
|
||||||
|
requestLogger.info(
|
||||||
|
{ host: req.hostname, path: req.path, method: req.method },
|
||||||
|
"request started"
|
||||||
|
);
|
||||||
|
next();
|
||||||
|
} catch (err) {
|
||||||
|
requestLogger.error({ err }, "error in request log middleware");
|
||||||
|
next(err);
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -7,10 +7,22 @@ export const errorHandler: ErrorRequestHandler = (err, req, res) => {
|
|||||||
message: err.message,
|
message: err.message,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
req.logger.error({ err }, 'an error occurred');
|
||||||
|
};
|
||||||
|
|
||||||
export const wrongRouteHandler: RequestHandler = (req, res) => {
|
export const wrongRouteHandler: RequestHandler = (req, res) => {
|
||||||
const statusCode = 404;
|
const statusCode = 404;
|
||||||
|
const message = 'Route not found. Request failed with status code 404';
|
||||||
res.status(statusCode).json({
|
res.status(statusCode).json({
|
||||||
status: statusCode,
|
status: statusCode,
|
||||||
message: 'Route not found. Request failed with status code 404 ',
|
message,
|
||||||
});
|
});
|
||||||
}
|
req.logger.info({
|
||||||
|
message,
|
||||||
|
path: req.path,
|
||||||
|
params: req.params,
|
||||||
|
headers: req.headers,
|
||||||
|
body: req.body,
|
||||||
|
ip: req.ip,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user