|
@@ -0,0 +1,60 @@
|
|
|
+import type { Context } from './types'
|
|
|
+
|
|
|
+export type Logger = ReturnType<typeof createLogger>
|
|
|
+
|
|
|
+export type LogLevel = keyof typeof LogLevels
|
|
|
+
|
|
|
+const LogLevels = {
|
|
|
+ trace: 1,
|
|
|
+ debug: 2,
|
|
|
+ info: 3,
|
|
|
+ warn: 4,
|
|
|
+ error: 5,
|
|
|
+}
|
|
|
+
|
|
|
+const LogLevelStrings: Record<LogLevel, string> = {
|
|
|
+ trace: 'TRC',
|
|
|
+ debug: 'DBG',
|
|
|
+ info: 'INF',
|
|
|
+ warn: 'WRN',
|
|
|
+ error: 'ERR',
|
|
|
+}
|
|
|
+
|
|
|
+function createLogger({ config }: Context) {
|
|
|
+ // If an invalid log level is provided, default to info level
|
|
|
+ const minLevel = LogLevels[config.log.level as LogLevel] || LogLevels.info
|
|
|
+
|
|
|
+ function write(level: LogLevel, ...a: unknown[]) {
|
|
|
+ const time = new Date().toLocaleTimeString()
|
|
|
+ if (level === 'trace') {
|
|
|
+ // Don't print TRC as console.trace prefixes "Trace: " and prints stack
|
|
|
+ console.trace(time, ...a)
|
|
|
+ } else {
|
|
|
+ console[level](time, LogLevelStrings[level], ...a)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function trace(...a: unknown[]) {
|
|
|
+ if (minLevel <= LogLevels.trace) write('trace', ...a)
|
|
|
+ }
|
|
|
+
|
|
|
+ function debug(...a: unknown[]) {
|
|
|
+ if (minLevel <= LogLevels.debug) write('debug', ...a)
|
|
|
+ }
|
|
|
+
|
|
|
+ function info(...a: unknown[]) {
|
|
|
+ if (minLevel <= LogLevels.info) write('info', ...a)
|
|
|
+ }
|
|
|
+
|
|
|
+ function warn(...a: unknown[]) {
|
|
|
+ if (minLevel <= LogLevels.warn) write('warn', ...a)
|
|
|
+ }
|
|
|
+
|
|
|
+ function error(...a: unknown[]) {
|
|
|
+ if (minLevel <= LogLevels.error) write('error', ...a)
|
|
|
+ }
|
|
|
+
|
|
|
+ return { trace, debug, info, warn, error }
|
|
|
+}
|
|
|
+
|
|
|
+export default createLogger
|