@aimee-blue/ab-service-kit
Version:
Aimee Blue Service Template
58 lines (51 loc) • 1.47 kB
text/typescript
import { BasicLogger, createBasicLogger } from '.';
import util from 'util';
export function trimWhitespace(arg: unknown) {
if (typeof arg === 'string') {
return arg
.replace(/^(\s*\n\s*|\s)+/gu, '')
.replace(/(\s*\n\s*|\s)+$/gu, '');
}
return arg;
}
export function isNotEmptyOrLineBreak(arg: unknown) {
if (typeof arg === 'string') {
const trimmed = arg;
if (trimmed.length === 0) {
return false;
}
}
return true;
}
const allowedTypes = ['string', 'number', 'boolean'];
export function transformValue(arg: unknown) {
if (allowedTypes.includes(typeof arg)) {
return arg;
}
return util.inspect(arg, {
compact: true,
colors: false,
depth: 3,
});
}
export function friendlyLogEntry(...args: unknown[]) {
return JSON.stringify(
args
.map(trimWhitespace)
.filter(isNotEmptyOrLineBreak)
.map(transformValue)
);
}
/**
* Converts the whole logging entry into a single JSON string which
* makes this compatible with Docker and allow multiline data like
* exceptions to be retained within same log entry.
*/
export const createContainerFriendlyLogger = (): BasicLogger => {
const logger = createBasicLogger();
return Object.freeze({
log: (...args: unknown[]) => logger.log(friendlyLogEntry(...args)),
warn: (...args: unknown[]) => logger.warn(friendlyLogEntry(...args)),
error: (...args: unknown[]) => logger.error(friendlyLogEntry(...args)),
});
};