nodejs-logsage
Version:
Powerful logger module for NestJS, seamlessly integrating Pino and Winston for flexible logging with easy configuration.
2 lines (1 loc) • 3.06 kB
JavaScript
import{v4 as C}from"uuid";import{createNamespace as _,getNamespace as x}from"cls-hooked";var R="x-trace-id",l="logsage",I="EXECUTION_LOG_START_TIME",u="LOGGER_OPTIONS",N="EXECUTION_LOG_CALLER";var c=class c{static getTraceIdField(){return c.traceId}static setTraceId(e){c.traceId=e}};c.traceId=R;var a=c;function b(...i){let e=a.getTraceIdField(),t=null,r=[],s=null,g=null;for(let o of i.filter(E=>E))o&&typeof o=="object"&&(e in o&&(t=o[e]),I in o&&(s=new Date().getTime()-(typeof o[I]=="number"?o[I]:0)),N in o&&(g=o[N])),Object?.keys(o)?.length&&r.push(o);let m=r.filter(o=>o).map(o=>typeof o=="object"?JSON.stringify(o):o).join(" ");return s!==null&&(m=`[${g?g+": ":""}${s} ms]:${m}`),t&&(m=`[${t}]:${m}`),m}var n=b;var f=class f{use(e,t,r){let s=a.getTraceIdField(),g=e?.headers?.[s]??e?.body?.[s]??e?.query?.[s]??C();f.clsNamespace.run(()=>{e.headers[s]=g;let d=e.headers[s];f.clsNamespace.set(s,d),r()})}static getTraceId(){let e=a.getTraceIdField(),t=x(l);return t?t.get(e):""}};f.clsNamespace=x(l)??_(l);var p=f;import D from"pino";import{format as P}from"date-fns";var T=class{constructor(e){this.logger=D({transport:{target:"pino-pretty"},base:{pid:!1},timestamp:()=>`,"time":"${P(new Date,"yyyy-MM-dd'T'HH:mm:ss")}"`,...e})}info(...e){let t=n(...e);this.logger.info(t)}warn(...e){let t=n(...e);this.logger.warn(t)}error(...e){let t=n(...e);this.logger.error(t)}debug(...e){let t=n(...e);this.logger.debug(t)}};import{createLogger as A,transports as G,format as S}from"winston";var{combine:W,timestamp:F,printf:$,colorize:K}=S,L=class{constructor(e){this.logger=A({transports:[new G.Console],format:W(K({all:!0}),F({format:"YYYY-MM-DDThh:mm:ss"}),$(t=>`[${t.timestamp}] ${t.level}: ${t.message}`)),...e})}info(...e){let t=n(...e);this.logger.info(t)}warn(...e){let t=n(...e);this.logger.warn(t)}error(...e){let t=n(...e);this.logger.error(t)}debug(...e){let t=n(...e);this.logger.debug(t)}};function w({type:i,options:e}){switch(i){case"pino":return new T(e);case"winston":return new L(e);default:throw new Error("Invalid logger type")}}var v=class{constructor(){this.db=new Map}get(e){return this.db.get(e)}set(e,t,r=0){this.db.set(e,t),r!==0&&setTimeout(()=>{this.del(e)},r*1e3)}del(e){this.db.delete(e)}},q=new v,O=q;var y=class{constructor(e={type:"pino"}){this.logger=w(e),O.set(u,e)}info(...e){this.logWithRequestId("info",...e)}warn(...e){this.logWithRequestId("warn",...e)}error(...e){this.logWithRequestId("error",...e)}debug(...e){this.logWithRequestId("debug",...e)}addRequestId(...e){let t=a.getTraceIdField(),r=p.getTraceId();return r?e.concat({[t]:r}):e}logWithRequestId(e,...t){let r=this.addRequestId(...t);this.logger[e](...r)}};var h=class{use(e,t,r){let s=()=>{let d=O.get(u);return new y(d??{type:"pino"})},g=performance.now();t.on("finish",()=>{let m=(performance.now()-g).toFixed(3);s().info({method:e?.method,url:e?.url,headers:e?.headers,query:e?.query,body:e?.body,responseTime:`${m} ms`,statusCode:t?.statusCode})}),r()}};var Ae=i=>{i.use(new p().use),i.use(new h().use)};export{p as LoggerMiddleware,Ae as logsageMiddleware};