morgan-like-format-options.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import type { IncomingMessage, ServerResponse } from 'node:http';
  2. /**
  3. * Morgan-like log message formatters for pino-http.
  4. *
  5. * Produces concise one-liner messages in the style of morgan's "combined" format:
  6. * GET /page/path 200 - 12ms
  7. *
  8. * Usage with pino-http:
  9. * pinoHttp({ ...morganLikeFormatOptions, logger })
  10. */
  11. type CustomSuccessMessage = (
  12. req: IncomingMessage,
  13. res: ServerResponse,
  14. responseTime: number,
  15. ) => string;
  16. type CustomErrorMessage = (
  17. req: IncomingMessage,
  18. res: ServerResponse,
  19. error: Error,
  20. ) => string;
  21. type LogLevel = 'info' | 'warn' | 'error';
  22. type CustomLogLevel = (
  23. req: IncomingMessage,
  24. res: ServerResponse,
  25. error: Error | undefined,
  26. ) => LogLevel;
  27. export const morganLikeFormatOptions: {
  28. customSuccessMessage: CustomSuccessMessage;
  29. customErrorMessage: CustomErrorMessage;
  30. customLogLevel: CustomLogLevel;
  31. } = {
  32. customSuccessMessage: (req, res, responseTime) => {
  33. return `${req.method} ${req.url} ${res.statusCode} - ${Math.round(responseTime)}ms`;
  34. },
  35. customErrorMessage: (req, res, error) => {
  36. return `${req.method} ${req.url} ${res.statusCode} - ${error.message}`;
  37. },
  38. customLogLevel: (_req, res, error) => {
  39. if (error != null || res.statusCode >= 500) return 'error';
  40. if (res.statusCode >= 400) return 'warn';
  41. return 'info';
  42. },
  43. };