feat: add pino for logging

This commit is contained in:
Tim Man
2023-07-19 13:18:05 +08:00
parent dc5d568161
commit 38a397e2f1
7 changed files with 697 additions and 203 deletions

View File

@@ -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

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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",

View File

@@ -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
View 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);
}
};

View File

@@ -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,
});
};