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