Skip to content

Instantly share code, notes, and snippets.

@love8587
Created January 31, 2020 15:34
Show Gist options
  • Save love8587/5fba4ffaddd46e331af630dd61de14fa to your computer and use it in GitHub Desktop.
Save love8587/5fba4ffaddd46e331af630dd61de14fa to your computer and use it in GitHub Desktop.
NodeJs - Logging with tracer ID using cls-hooked (No need to pass the tracer ID as a parameter)
import { createLogger, format, transports } from 'winston';
const { combine, timestamp, label, splat, printf, colorize, json } = format;
import requestTracer from '../helpers/request-tracer';
const defaultFormat = printf(
({ level = 'debug', message = '', label = 'default', timestamp, payload = {} }) => {
let payloadStr = '';
try {
payloadStr = JSON.stringify(payload);
} catch (err) {
// payloadStr = '';
}
const traceId = requestTracer('app').getTraceId() || 'unknown.traceid';
return `${timestamp} [${label}] [${traceId}] ${level}: ${message} - ${payloadStr || ''}`;
},
);
const hostname = require('os').hostname();
const consoleTransport = new transports.Console({ format: defaultFormat });
/**
* @description inspired by https://habr.com/en/post/442392/
* @author Steve Baek
*/
const getLogger = function(fileName = 'unknown.file') {
const hostName = hostname || 'unknown.host';
const packageName = process.env.npm_package_name || 'unknown.package';
const fullLabel = `${packageName}:${hostName}:${fileName}`;
const logger = createLogger({
level: process.env.LOGGER_LEVEL || 'debug',
exitOnError: false,
format: combine(label({ label: fullLabel }), timestamp(), splat(), colorize(), json()),
transports: [
consoleTransport,
],
});
return logger;
};
export default getLogger;
import { Middleware, Context } from 'koa';
import cls from 'cls-hooked';
import uuidv1 from 'uuid/v1';
let clsNamespace: cls.Namespace;
/**
* @description inspired by https://habr.com/en/post/442392/
* @author Steve Baek
*/
export default function requestTracer(nameSpace = 'app') {
if (!clsNamespace) {
clsNamespace = cls.createNamespace(nameSpace);
}
function koaMiddleWare(): Middleware {
return async (ctx: Context, next: Function) => {
clsNamespace.bindEmitter(ctx.req);
clsNamespace.bindEmitter(ctx.res);
const traceID = uuidv1();
clsNamespace.run(() => {
clsNamespace.set('traceID', traceID);
return next();
});
};
}
function getTraceId() {
return clsNamespace.get('traceID') ?? '';
}
return {
koaMiddleWare,
getTraceId,
};
}
@love8587
Copy link
Author

@love8587
Copy link
Author

special thanks to @puzpuzpuz - puzpuzpuz/cls-rtracer#24

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment