nodejs-logsage
Version:
Powerful logger module for NestJS, seamlessly integrating Pino and Winston for flexible logging with easy configuration.
2 lines (1 loc) • 2.99 kB
JavaScript
var R="x-trace-id",l="logsage",I="EXECUTION_LOG_START_TIME",u="LOGGER_OPTIONS",h="EXECUTION_LOG_CALLER";var d=class d{static getTraceIdField(){return d.traceId}static setTraceId(e){d.traceId=e}};d.traceId=R;var n=d;function b(...a){let e=n.getTraceIdField(),t=null,r=[],s=null,g=null;for(let o of a.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)),h in o&&(g=o[h])),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 i=b;import C from"pino";import{format as _}from"date-fns";var T=class{constructor(e){this.logger=C({transport:{target:"pino-pretty"},base:{pid:!1},timestamp:()=>`,"time":"${_(new Date,"yyyy-MM-dd'T'HH:mm:ss")}"`,...e})}info(...e){let t=i(...e);this.logger.info(t)}warn(...e){let t=i(...e);this.logger.warn(t)}error(...e){let t=i(...e);this.logger.error(t)}debug(...e){let t=i(...e);this.logger.debug(t)}};import{createLogger as D,transports as P,format as A}from"winston";var{combine:G,timestamp:S,printf:W,colorize:F}=A,L=class{constructor(e){this.logger=D({transports:[new P.Console],format:G(F({all:!0}),S({format:"YYYY-MM-DDThh:mm:ss"}),W(t=>`[${t.timestamp}] ${t.level}: ${t.message}`)),...e})}info(...e){let t=i(...e);this.logger.info(t)}warn(...e){let t=i(...e);this.logger.warn(t)}error(...e){let t=i(...e);this.logger.error(t)}debug(...e){let t=i(...e);this.logger.debug(t)}};function M({type:a,options:e}){switch(a){case"pino":return new T(e);case"winston":return new L(e);default:throw new Error("Invalid logger type")}}import{v4 as $}from"uuid";import{createNamespace as K,getNamespace as w}from"cls-hooked";var c=class c{use(e,t,r){let s=n.getTraceIdField(),g=e?.headers?.[s]??e?.body?.[s]??e?.query?.[s]??$();c.clsNamespace.run(()=>{e.headers[s]=g;let p=e.headers[s];c.clsNamespace.set(s,p),r()})}static getTraceId(){let e=n.getTraceIdField(),t=w(l);return t?t.get(e):""}};c.clsNamespace=w(l)??K(l);var f=c;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=M(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=n.getTraceIdField(),r=f.getTraceId();return r?e.concat({[t]:r}):e}logWithRequestId(e,...t){let r=this.addRequestId(...t);this.logger[e](...r)}};var N=class{use(e,t,r){let s=()=>{let p=O.get(u);return new y(p??{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()}};export{N as RequestMiddleware};