mirror of
https://github.com/alexgo-io/xverse-stacks-transaction-sponsor.git
synced 2026-01-12 22:43:48 +08:00
feat: add pino for logging
This commit is contained in:
@@ -2,3 +2,4 @@ SEED="your sponsor wallet seed phrase"
|
||||
PASSWORD="sponsoredbyxverse"
|
||||
NUM_ADDRESSES=5
|
||||
MAX_FEE=50000
|
||||
LOG_LEVEL=debug
|
||||
|
||||
@@ -29,4 +29,5 @@ export default {
|
||||
maxFee: isEnvVarValid(
|
||||
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",
|
||||
"dotenv": "^10.0.0",
|
||||
"express": "^4.17.1",
|
||||
"node-cache": "^5.1.2"
|
||||
"node-cache": "^5.1.2",
|
||||
"pino": "^8.14.1",
|
||||
"pino-pretty": "^10.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/cors": "^2.8.13",
|
||||
|
||||
@@ -24,6 +24,7 @@ initializeSponsorWallet();
|
||||
|
||||
app.use(json());
|
||||
app.use(cors());
|
||||
app.use(requestLogMiddleware);
|
||||
|
||||
app.get('/', (_: Request, res: Response) => {
|
||||
res.send('Ok');
|
||||
@@ -34,7 +35,7 @@ app.use(errorHandler);
|
||||
app.use(wrongRouteHandler);
|
||||
|
||||
const server = app.listen(port, () => {
|
||||
console.log(
|
||||
logger.info(
|
||||
`Stacks Transaction Sponsor Web Service started and listening at http://localhost:${port} in ${app.get(
|
||||
'env',
|
||||
)} 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,
|
||||
});
|
||||
|
||||
req.logger.error({ err }, 'an error occurred');
|
||||
};
|
||||
|
||||
export const wrongRouteHandler: RequestHandler = (req, res) => {
|
||||
const statusCode = 404;
|
||||
const message = 'Route not found. Request failed with status code 404';
|
||||
res.status(statusCode).json({
|
||||
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