Skip to content

Instantly share code, notes, and snippets.

@ItaruTran
Last active July 6, 2022 09:51
Show Gist options
  • Save ItaruTran/9eb8de423afbacf14257b184e7b4fdfc to your computer and use it in GitHub Desktop.
Save ItaruTran/9eb8de423afbacf14257b184e7b4fdfc to your computer and use it in GitHub Desktop.
Create and control log level by env (Example: `LIMIT_LOG=abc-module.*= verbose; main= info; x-module.api= warn`)
import { loggers, format, transports } from 'winston';
import { inspect } from 'util';
const myFormat = format.printf((info) => {
const { level, message, label, timestamp } = info;
const extra = info[Symbol.for('splat')];
let text = `${timestamp} [${label}] ${level}: ${message}`;
if (extra) {
for (let index = 0; index < extra.length; index++) {
const e = extra[index];
if (typeof e === 'object') {
text += ` ${inspect(e, { showHidden: false, colors: true, depth: 2 })}`;
} else {
text += ` ${e}`;
}
}
}
return text;
});
let config;
let defaultLevel = 'info';
let groupLog;
if (process.env.LIMIT_LOG) {
defaultLevel = 'disable';
config = {};
groupLog = [];
const parsed = process.env.LIMIT_LOG.split(';');
for (let index = 0; index < parsed.length; index++) {
let label;
let level = 'info';
const cf = parsed[index];
if (cf.indexOf('=') > -1) {
[label, level] = cf.split('=');
label = label.trim();
level = level.trim();
} else {
label = cf.trim();
}
if (label === '*') {
defaultLevel = level;
} else if (label.endsWith('.*')) {
groupLog.push({ group: label.substring(0, label.length - 2), level });
} else {
config[label] = level;
}
}
}
/**
* @param {string} label
*/
export function createLogger(label) {
let minLevel;
let silent = false;
if (config?.[label]) {
minLevel = config[label];
} else if (groupLog) {
for (let index = 0; index < groupLog.length; index++) {
const element = groupLog[index];
if (label.startsWith(element.group)) {
minLevel = element.level;
}
}
}
if (!minLevel) {
if (defaultLevel === 'disable') {
silent = true;
} else {
minLevel = defaultLevel;
}
}
let formatLog;
if (process.env.NODE_ENV === 'development') {
formatLog = format.combine(
format.label({ label }),
format.timestamp({ format: 'HH:mm:ss' }),
format.colorize(),
myFormat
);
} else {
formatLog = format.combine(
format.label({ label }),
format.timestamp(),
format.json({ maximumDepth: 2 })
);
}
return loggers.add(label, {
silent,
level: minLevel,
format: formatLog,
transports: [new transports.Console()]
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment