nightingale-logger
Version:
Logger for browser and node
1 lines • 26.9 kB
Source Map (JSON)
{"version":3,"file":"index-node22.mjs","sources":["../src/inspectValue.target-node.ts","../src/index.ts"],"sourcesContent":["import * as util from \"node:util\";\n\nexport const inspectValue = (value: unknown): string =>\n // Note: inspect is a special function for node:\n // https://github.com/nodejs/node/blob/a1bda1b4deb08dfb3e06cb778f0db40023b18318/lib/util.js#L210\n util.inspect(value, { depth: 6 });\n","import { Level } from \"nightingale-levels\";\nimport type {\n Handler,\n LogRecord,\n Metadata,\n MetadataStyles,\n Processor,\n Styles,\n} from \"nightingale-types\";\nimport { inspectValue } from \"./inspectValue.ts\";\n\nexport { Level } from \"nightingale-levels\";\n\nexport interface Options<T extends Metadata> {\n symbol?: string;\n metadataStyles?: MetadataStyles<T>;\n styles?: Styles;\n}\n\nexport interface ComputedConfigForKey {\n handlers: Handler[];\n processors: Processor[];\n}\n\nexport interface ExtendedFunctionNameMetadata {\n functionName: string;\n}\n\nexport interface Config {\n handler?: Handler;\n handlers?: Handler[];\n key?: string;\n keys?: string[];\n pattern?: RegExp;\n processor?: Processor;\n processors?: Processor[];\n stop?: boolean;\n}\n\ndeclare global {\n var __NIGHTINGALE_CONFIG: Config[];\n\n var __NIGHTINGALE_LOGGER_MAP_CACHE: Map<string, ComputedConfigForKey>;\n\n var __NIGHTINGALE_CONFIG_DEFAULT: ComputedConfigForKey;\n\n var __NIGHTINGALE_GLOBAL_HANDLERS: unknown;\n\n var __NIGHTINGALE_GET_CONFIG_FOR_LOGGER: (\n key: string,\n ) => ComputedConfigForKey;\n\n var __NIGHTINGALE_GET_CONFIG_FOR_LOGGER_RECORD: (\n key: string,\n level: number,\n ) => ComputedConfigForKey;\n}\n\nconst globalOrWindow: typeof globalThis =\n typeof globalThis !== \"undefined\" ? globalThis : globalThis;\n\nif (!globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER) {\n globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER =\n (): ComputedConfigForKey => ({\n handlers: [],\n processors: [],\n });\n}\n\nif (!globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER_RECORD) {\n globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER_RECORD = (\n key: string,\n level: Level,\n ): ComputedConfigForKey => {\n const { handlers, processors }: ComputedConfigForKey =\n globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER(key);\n\n return {\n handlers: handlers.filter(\n (handler) =>\n level >= handler.minLevel &&\n (!handler.isHandling || handler.isHandling(level, key)),\n ),\n processors,\n };\n };\n}\n\nfunction getConfigForLoggerRecord(\n key: string,\n recordLevel: Level,\n): ComputedConfigForKey {\n return globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER_RECORD(\n key,\n recordLevel,\n );\n}\n\nfunction isError(messageOrError: Error | string): messageOrError is Error {\n return messageOrError instanceof Error;\n}\n\n/**\n * Interface that allows you to log records.\n * This records are treated by handlers\n */\nexport class Logger {\n private contextObject?: Record<string, unknown>;\n\n readonly key: string;\n\n readonly displayName?: string;\n\n /**\n * Create a new Logger\n *\n * @param {string} key\n * @param {string} [displayName]\n */\n constructor(key: string, displayName?: string) {\n this.key = key;\n this.displayName = displayName;\n\n if (process.env.NODE_ENV !== \"production\" && key.includes(\".\")) {\n throw new Error(\n `nightingale: \\`.\\` in key is no longer supported, use \\`:\\` instead (key: ${key})`,\n );\n }\n }\n\n /** @private */\n protected getHandlersAndProcessors(\n recordLevel: number,\n ): ComputedConfigForKey {\n return getConfigForLoggerRecord(this.key, recordLevel);\n }\n\n /** @private */\n getConfig(): Readonly<ComputedConfigForKey> {\n return globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER(this.key);\n }\n\n /**\n * Create a child logger\n */\n child(childSuffixKey: string, childDisplayName?: string): Logger {\n return new Logger(`${this.key}:${childSuffixKey}`, childDisplayName);\n }\n\n /**\n * Create a new Logger with the same key a this attached context\n *\n * @example\n * ```typescript\n * const loggerMyService = new Logger('app:myService');\n * function someAction(arg1) {\n * const logger = loggerMyService.context({ arg1 });\n * logger.enter(someAction);\n * // do stuff\n * logger.info('info');\n * // do stuff\n * logger.exit(someAction);\n * }\n * ```\n *\n */\n context(context: Record<string, unknown>): Logger {\n const logger = new Logger(this.key);\n logger.setContext(context);\n return logger;\n }\n\n /**\n * Get the context of this logger\n */\n getContextObject(): Readonly<Record<string, unknown>> | undefined {\n return this.contextObject;\n }\n\n /**\n * Set the context of this logger\n *\n * @param {Object} context\n */\n setContext(context: Record<string, unknown>): void {\n this.contextObject = context;\n }\n\n /**\n * Extends existing context of this logger\n */\n extendsContext(extendedContext: Record<string, unknown>): void {\n if (this.contextObject === undefined) {\n throw new Error(\n \"Cannot extends context that does not exists. Use setContext(context) first.\",\n );\n }\n Object.assign(this.contextObject, extendedContext);\n }\n\n /**\n * Handle a record\n *\n * Use this only if you know what you are doing.\n */\n addRecord<T extends Metadata>(record: Readonly<LogRecord<T>>): void {\n const { handlers, processors } = this.getHandlersAndProcessors(\n record.level,\n );\n\n if (handlers.length === 0) {\n if (record.level > Level.ERROR) {\n // eslint-disable-next-line no-console\n console.log(\"[nightingale] no logger for > error level.\", {\n key: record.key,\n message: record.message,\n });\n }\n return;\n }\n\n if (processors) {\n processors.forEach((process) => {\n process(record, record.context);\n });\n }\n\n handlers.some((handler) => handler.handle(record) === false);\n }\n\n /**\n * Log a message\n */\n log<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n level: Level = Level.INFO,\n options?: Options<T>,\n ): void {\n const isMessageError = isError(messageOrError);\n\n const message = isMessageError\n ? `${messageOrError.name}: ${messageOrError.message}`\n : messageOrError;\n\n const extendedMetadata =\n isMessageError && !(metadata && Object.hasOwn(metadata, \"error\"))\n ? { ...metadata, error: messageOrError }\n : metadata;\n\n const context = extendedMetadata?.context;\n if (extendedMetadata) {\n delete extendedMetadata.context;\n }\n\n const record: LogRecord<NonNullable<typeof extendedMetadata>> = {\n level,\n key: this.key,\n displayName: this.displayName,\n datetime: new Date(),\n message,\n context: context || this.contextObject,\n metadata: extendedMetadata as NonNullable<typeof extendedMetadata>,\n extra: {},\n ...options,\n };\n this.addRecord(record);\n }\n\n /**\n * Log a trace message\n */\n trace<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.TRACE, { metadataStyles });\n }\n\n /**\n * Log a debug message\n */\n debug<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.DEBUG, { metadataStyles });\n }\n\n /**\n * Notice an info message\n */\n notice<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.NOTICE, { metadataStyles });\n }\n\n /**\n * Log an info message\n */\n info<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.INFO, { metadataStyles });\n }\n\n /**\n * Log a warn message\n */\n warn<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.WARN, { metadataStyles });\n }\n\n /**\n * Log an error message\n *\n * @example\n * ```typescript\n * const logger = new Logger('something');\n * try {\n * throw new Error('Always throws here');\n * } catch (error) {\n * logger.error('caught error', { error });\n * }\n * ```\n */\n error<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.ERROR, { metadataStyles });\n }\n\n /**\n * Log an critical message\n */\n critical<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.CRITICAL, { metadataStyles });\n }\n\n /**\n * Log a fatal message\n *\n * @example\n * ```typescript\n * const logger = new Logger('something');\n * try {\n * throw new Error('Always throws here');\n * } catch (error) {\n * logger.error('caught error', { error });\n * process.exit(1);\n * }\n */\n fatal<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.FATAL, { metadataStyles });\n }\n\n /**\n * Log an alert message\n */\n alert<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.ALERT, { metadataStyles });\n }\n\n /**\n * Log an inspected value\n */\n inspectValue<T extends Metadata>(\n value: unknown,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n const inspectedValue = inspectValue(value);\n this.log(inspectedValue, metadata, Level.DEBUG, {\n metadataStyles,\n styles: [\"gray\"],\n });\n }\n\n /**\n * Log a debugged var\n */\n inspectVar<T extends Metadata>(\n varName: string,\n varValue: unknown,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n const inspectedValue = inspectValue(varValue);\n this.log(`${varName} = ${inspectedValue}`, metadata, Level.DEBUG, {\n metadataStyles,\n styles: [\"cyan\"],\n });\n }\n\n /**\n * Alias for infoSuccess\n */\n success<T extends Metadata>(\n message: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.infoSuccess(message, metadata, metadataStyles);\n }\n\n /**\n * Log an info success message\n */\n infoSuccess<T extends Metadata>(\n message: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(message, metadata, Level.INFO, {\n metadataStyles,\n symbol: \"✔\",\n styles: [\"green\", \"bold\"],\n });\n }\n\n /**\n * Log an debug success message\n */\n debugSuccess<T extends Metadata>(\n message: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(message, metadata, Level.DEBUG, {\n metadataStyles,\n symbol: \"✔\",\n styles: [\"green\"],\n });\n }\n\n /**\n * Alias for infoFail\n */\n fail<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.infoFail(messageOrError, metadata, metadataStyles);\n }\n\n /**\n * Log an info fail message\n */\n infoFail<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.INFO, {\n metadataStyles,\n symbol: \"✖\",\n styles: [\"red\", \"bold\"],\n });\n }\n\n /**\n * Log an debug fail message\n */\n debugFail<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.DEBUG, {\n metadataStyles,\n symbol: \"✖\",\n styles: [\"red\"],\n });\n }\n\n /**\n * @returns {number} time to pass to timeEnd\n */\n time<T extends Metadata>(\n message?: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n level: number = Level.DEBUG,\n ): number {\n if (message) {\n this.log(message, metadata, level, { metadataStyles });\n }\n\n return Date.now();\n }\n\n infoTime<T extends Metadata>(\n message?: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): number {\n return this.time(message, metadata, metadataStyles, Level.INFO);\n }\n\n /**\n * Finds difference between when this method\n * was called and when the respective time method\n * was called, then logs out the difference\n * and deletes the original record\n */\n timeEnd<T extends Metadata>(\n startTime: number,\n message: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n level: number = Level.DEBUG,\n options?: Options<T>,\n ): void {\n const now = Date.now();\n\n const diffTime = now - startTime;\n let readableTime;\n\n if (diffTime < 1000) {\n readableTime = `${diffTime}ms`;\n } else {\n const seconds = diffTime > 1000 ? Math.floor(diffTime / 1000) : 0;\n const ms = diffTime - seconds * 1000;\n readableTime = `${seconds ? `${seconds}s and ` : \"\"}${ms}ms`;\n }\n\n const extendedMetadata = {\n ...metadata,\n readableTime,\n timeMs: diffTime,\n };\n\n this.log(message, extendedMetadata, level, { ...options, metadataStyles });\n }\n\n /**\n * Like timeEnd, but with INFO level\n */\n infoTimeEnd<T extends Metadata>(\n time: number,\n message: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.timeEnd(time, message, metadata, metadataStyles, Level.INFO);\n }\n\n /**\n * Like timeEnd, but with INFO level\n */\n infoSuccessTimeEnd<T extends Metadata>(\n time: number,\n message: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.timeEnd(time, message, metadata, metadataStyles, Level.INFO, {\n symbol: \"✔\",\n styles: [\"green\", \"bold\"],\n });\n }\n\n /**\n * Log an enter in a function\n *\n * @example\n * ```typescript\n * class A {\n * method(arg1) {\n * logger.enter(method, { arg1 });\n * // Do your stuff\n * }\n * }\n * ```\n *\n */\n enter<T extends Metadata, Fn extends (...args: unknown[]) => unknown>(\n fn: Fn,\n metadata?: T,\n metadataStyles?: MetadataStyles<ExtendedFunctionNameMetadata & T>,\n ): void {\n const extendedMetadata = {\n ...metadata,\n functionName: fn.name,\n };\n this.log(\"enter\", extendedMetadata, Level.TRACE, { metadataStyles });\n }\n\n /**\n * Log an exit in a function\n *\n * @example\n * ```typescript\n * const logger = new Logger('myNamespace:A');\n * class A {\n * method(arg1) {\n * // Do your stuff\n * logger.exit(method, { arg1 });\n * }\n * }\n * ```\n */\n exit<T extends Metadata, Fn extends (...args: unknown[]) => unknown>(\n fn: Fn,\n metadata?: T,\n metadataStyles?: MetadataStyles<ExtendedFunctionNameMetadata & T>,\n ): void {\n const extendedMetadata = {\n ...metadata,\n functionName: fn.name,\n };\n this.log(\"exit\", extendedMetadata, Level.TRACE, { metadataStyles });\n }\n\n /**\n * Wrap around a function to log enter and exit of a function\n *\n * @example\n * ```typescript\n * const logger = new Logger('myNamespace:A');\n * class A {\n * method() {\n * logger.wrap(method, () => {\n * // Do your stuff\n * });\n * }\n * }\n * ```\n */\n wrap<Fn extends (...args: unknown[]) => unknown>(\n fn: Fn,\n callback: () => void,\n ): void;\n\n wrap<T extends Metadata, Fn extends (...args: unknown[]) => unknown>(\n fn: Fn,\n metadata: T,\n callback: () => void,\n ): void;\n\n wrap<T extends Metadata, Fn extends (...args: unknown[]) => unknown>(\n fn: Fn,\n metadata: T,\n metadataStyles: MetadataStyles<T>,\n callback: () => void,\n ): void;\n\n wrap<T extends Metadata, Fn extends (...args: unknown[]) => unknown>(\n fn: Fn,\n option1: T | (() => void),\n option2?: MetadataStyles<T> | (() => void),\n callback?: () => void,\n ): void {\n let metadata: T | undefined;\n let metadataStyles: MetadataStyles<T> | undefined;\n\n if (typeof option1 === \"function\") {\n callback = option1;\n } else {\n metadata = option1;\n\n if (typeof option2 === \"function\") {\n callback = option2;\n } else {\n metadataStyles = option2;\n }\n }\n\n this.enter(fn, metadata, metadataStyles);\n (callback as () => void)();\n this.exit(fn);\n }\n}\n"],"names":["process"],"mappings":"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"}