@trifrost/core
Version:
Blazingly fast, runtime-agnostic server framework for modern edge and node environments
108 lines (107 loc) • 3.38 kB
JavaScript
/* eslint-disable no-console */
import { deepFreeze } from '@valkyriestudios/utils/deep';
import { isNeObject } from '@valkyriestudios/utils/object';
import { createScrambler, OMIT_PRESETS } from '../../../utils/Scrambler';
/* Default format function */
const DEFAULT_FORMAT = (log) => '[' + log.time.toISOString() + '] [' + log.level + '] ' + log.message;
const INCLUSION_FIELDS = {
ctx: 1,
trace_id: 1,
span_id: 1,
time: 1,
level: 1,
global: 1,
};
function normalizeInclusion(inclusion) {
const acc = new Set();
for (let i = 0; i < inclusion.length; i++) {
const val = inclusion[i];
if (INCLUSION_FIELDS[val])
acc.add(val);
}
return [...acc.values()];
}
/**
* A structured console logger with support for grouping, custom formatting,
* and selective metadata inclusion.
*
* Ideal for local development, where concise yet contextual logs are key.
*/
export class ConsoleExporter {
/**
* Whether or not to use console groups (defaults to false)
*/
/**
* What aspects of the log object to be included
*/
/**
* Scrambler based on omit pattern provided
*/
/**
* Function to use to format the primary label.
* default format is "[{time}] [{level}] {message}"
*/
constructor(options) {
/* Configure grouped if passed */
this.
/* Configure scrambler */
this.
checks: Array.isArray(options?.omit) ? deepFreeze([...options.omit]) : OMIT_PRESETS.default,
});
/* Configure format if passed */
if (typeof options?.format === 'function')
this.
/* Configure include if passed */
this.
}
init(global_attrs) {
this.
}
async pushLog(log) {
const msg = this.
let has_meta = false;
const meta = {};
/* Data */
if (isNeObject(log.data)) {
has_meta = true;
meta.data = this.
}
/* Run inclusions */
if (this.
has_meta = true;
for (let i = 0; i < this.
const inc = this.
switch (inc) {
case 'global':
meta.global = this.
break;
case 'ctx':
meta[inc] = this.
break;
default:
meta[inc] = log[inc];
}
}
}
/* Write */
if (this.
console.groupCollapsed(msg);
console[log.level](meta);
console.groupEnd();
}
else if (has_meta) {
console[log.level](msg, meta);
}
else {
console[log.level](msg);
}
}
async flush() {
/* No-Op for console */
}
}