summaryrefslogtreecommitdiff
path: root/u/trace
diff options
context:
space:
mode:
Diffstat (limited to 'u/trace')
-rw-r--r--u/trace/itrace.ts2
-rw-r--r--u/trace/logger.ts51
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,
+ };
}
}