diff options
Diffstat (limited to 'u/trace')
-rw-r--r-- | u/trace/itrace.ts | 2 | ||||
-rw-r--r-- | u/trace/logger.ts | 51 |
2 files changed, 34 insertions, 19 deletions
diff --git a/u/trace/itrace.ts b/u/trace/itrace.ts index c3cb8ad..fcfbe32 100644 --- a/u/trace/itrace.ts +++ b/u/trace/itrace.ts @@ -48,7 +48,7 @@ export class TraceableImpl<T, TraceWith> implements ITraceable<T, TraceWith> { public flatMap<_T>( mapper: ITraceableMapper<T, ITraceable<_T, TraceWith>, TraceWith>, ): ITraceable<_T, TraceWith> { - return mapper(this); + return mapper(this); } public flatMapAsync<_T>( diff --git a/u/trace/logger.ts b/u/trace/logger.ts index 4f29839..8e62b02 100644 --- a/u/trace/logger.ts +++ b/u/trace/logger.ts @@ -11,6 +11,7 @@ export interface ILogger { debug: (...args: unknown[]) => void; warn: (...args: unknown[]) => void; error: (...args: unknown[]) => void; + sys: (...args: unknown[]) => void; } export enum LogLevel { UNKNOWN = "UNKNOWN", @@ -18,6 +19,7 @@ export enum LogLevel { WARN = "WARN", DEBUG = "DEBUG", ERROR = "ERROR", + SYS = "SYS", } const logLevelOrder: Array<LogLevel> = [ LogLevel.DEBUG, @@ -35,6 +37,7 @@ const defaultAllowedLevels = () => LogLevel.INFO, LogLevel.WARN, LogLevel.ERROR, + LogLevel.SYS, ] as Array<LogLevel>; export const logWithLevel = ( @@ -51,13 +54,21 @@ export const logWithLevel = ( return logger.warn; case LogLevel.ERROR: return logger.error; + case LogLevel.SYS: + return logger.sys; } }; export type LogTraceSupplier = ITraceWith<Supplier<string>>; const defaultTrace = () => `[${new Date().toISOString()}]`; -export const LoggerImpl = console; +export const LoggerImpl = { + log: console.log, + debug: console.debug, + warn: console.warn, + error: console.error, + sys: console.log, +}; export class LogTrace implements ITrace<LogTraceSupplier> { constructor( private readonly logger: ILogger = LoggerImpl, @@ -78,28 +89,32 @@ export class LogTrace implements ITrace<LogTraceSupplier> { } public trace(trace: LogTraceSupplier) { - const { line, level: _level } = this.foldTraces(this.traces.concat(trace)); + const { traces, level: _level } = this.foldTraces( + this.traces.concat(trace), + ); if (!this.allowedLevels().includes(_level)) return; const level = _level === LogLevel.UNKNOWN ? this.defaultLevel : _level; - logWithLevel(this.logger, level)(`[${level}]${line}`); + const line = { level, message: traces.at(-1), traces: traces.slice(0, -1) }; + logWithLevel( + this.logger, + level, + )(line); } - private foldTraces(traces: Array<LogTraceSupplier>) { - const { line, level } = traces.reduce( - (acc: { line: string; level: number }, t) => { - const val = typeof t === "function" ? t() : t; - if (isLogLevel(val)) { - return { - ...acc, - level: Math.max(logLevelOrder.indexOf(val), acc.level), - }; - } - const line = [acc.line, val].join(" "); - return { ...acc, line }; - }, - { line: "", level: -1 }, + private foldTraces(_traces: Array<LogTraceSupplier>) { + const _logTraces = _traces.map((trace) => + typeof trace === "function" ? trace() : trace, ); - return { line, level: logLevelOrder[level] ?? LogLevel.UNKNOWN }; + const _level = _logTraces + .filter((trace) => isLogLevel(trace)) + .reduce((acc, level) => Math.max(logLevelOrder.indexOf(level), acc), -1); + const level = logLevelOrder[_level] ?? LogLevel.UNKNOWN; + + const traces = _logTraces.filter((trace) => !isLogLevel(trace)); + return { + level, + traces, + }; } } |