log.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import type { Context } from './types'
  2. /** Logging context. */
  3. export type Logger = ReturnType<typeof createLogger>
  4. /** Log level (or severity). */
  5. export type LogLevel = keyof typeof LogLevels
  6. /** Log levels and their corresponding numeric severity. */
  7. const LogLevels = {
  8. trace: 1,
  9. debug: 2,
  10. info: 3,
  11. warn: 4,
  12. error: 5,
  13. }
  14. /** Log level translation map for display. */
  15. const LogLevelStrings: Record<LogLevel, string> = {
  16. trace: 'TRC',
  17. debug: 'DBG',
  18. info: 'INF',
  19. warn: 'WRN',
  20. error: 'ERR',
  21. }
  22. /** Create a logging context. */
  23. function createLogger({ config }: Context) {
  24. // If an invalid log level is provided, default to info level
  25. const minLevel = LogLevels[config.log.level as LogLevel] || LogLevels.info
  26. /**
  27. * Write a log message at a specific level of severity.
  28. */
  29. function write(level: LogLevel, ...a: unknown[]) {
  30. const time = new Date().toLocaleTimeString()
  31. if (level === 'trace') {
  32. // Don't print TRC as console.trace prefixes "Trace: " and prints stack
  33. console.trace(time, ...a)
  34. } else {
  35. console[level](time, LogLevelStrings[level], ...a)
  36. }
  37. }
  38. /** Write a trace message. */
  39. function trace(...a: unknown[]) {
  40. if (minLevel <= LogLevels.trace) write('trace', ...a)
  41. }
  42. /** Write a debug message. */
  43. function debug(...a: unknown[]) {
  44. if (minLevel <= LogLevels.debug) write('debug', ...a)
  45. }
  46. /** Write an informational message. */
  47. function info(...a: unknown[]) {
  48. if (minLevel <= LogLevels.info) write('info', ...a)
  49. }
  50. /** Write a warning message. */
  51. function warn(...a: unknown[]) {
  52. if (minLevel <= LogLevels.warn) write('warn', ...a)
  53. }
  54. /** Write an error message. */
  55. function error(...a: unknown[]) {
  56. if (minLevel <= LogLevels.error) write('error', ...a)
  57. }
  58. return { trace, debug, info, warn, error }
  59. }
  60. export default createLogger