Created
January 31, 2020 15:34
-
-
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)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
inspired by https://habr.com/en/post/442392/