UNPKG

nodejs-logitron

Version:

Powerful logger module for Nodejs/ Nestjs, seamlessly integrating Pino and Winston for flexible logging with easy configuration.

2 lines (1 loc) 5.6 kB
import{createLogger as pt,transports as ct,format as lt}from"winston";var W=(t=>(t.WINSTON="winston",t.PINO="pino",t))(W||{});import{v4 as K}from"uuid";import{AsyncLocalStorage as k}from"async_hooks";var f=new k;function P(o,e){f.run({traceId:o},e)}function q(o,e,t,r,...n){let s=new Date().toISOString(),a=f.getStore()?.traceId??"N/A",g=n.find(m=>m&&typeof m=="object")??null,c=r?.name&&typeof r?.time=="number"?`${r.name} ${r.time} ms`:"N/A";return`[${s}] [${o.toUpperCase()}] [${e.toUpperCase()}] [${a}] [${t}] [${g?JSON.stringify(g):"N/A"}] [${c}]`}var i=q;var G="x-trace-id",d="nodejs-logitron",z="EXECUTION_LOG_START_TIME";var B="EXECUTION_LOG_CALLER";var h=class h{static getTraceIdField(){return h.traceIdField}static setTraceIdField(e){h.traceIdField=e}static getTraceId(){return f.getStore()?.traceId??null}};h.traceIdField=G;var p=h;import U from"fs";import H from"readline";async function S(o){let{logFilePath:e,page:t,limit:r,logRegex:n,level:s,traceId:a,appName:g,message:c,execution:m,searchPayload:x}=o;if(!U.existsSync(e))throw new Error("File not found");let O=U.createReadStream(e,"utf-8"),y=H.createInterface({input:O,crlfDelay:1/0}),u=[],l=0,L=(t-1)*r,Y=L+r;for await(let w of y){let I=w.match(n);if(!I)continue;let[,J,M,R,T,F,E,b]=I,_=M?M.toLowerCase():"unknown",$=E&&E!=="N/A"?JSON.parse(E):"",D=b&&b!=="N/A"?b:"";s&&_!==s.toLowerCase()||a&&T!==a||g&&R?.toLowerCase()!==g.toLowerCase()||c&&!F?.toLowerCase().includes(c.toLowerCase())||m&&D!==m||x&&E!=="N/A"&&!JSON.stringify($).toLowerCase().includes(x.toLowerCase())||(l>=L&&l<Y&&u.push({id:T&&T.length>0?T:"N/A",timestamp:J,level:_,appName:R,message:F,payload:$,execution:D}),l++)}return{total:l,data:u.sort((w,I)=>new Date(I.timestamp).getTime()-new Date(w.timestamp).getTime())}}function We(o,e,t){let r=o?.headers?.[p.getTraceIdField()]??o?.body?.[p.getTraceIdField()]??o?.query?.[p.getTraceIdField()]??K();P(r,()=>t())}import Q from"pino";var v=class{constructor(e){this.appName=d;this.logger=Q({transport:{target:"pino-pretty",options:{ignore:"level"}},base:null,timestamp:!1,...e}),this.appName=e?.appName??d}infoWithExecutionTime(e,t,...r){this.logWithExecutionTime("info",e,t,...r)}warnWithExecutionTime(e,t,...r){this.logWithExecutionTime("warn",e,t,...r)}errorWithExecutionTime(e,t,...r){this.logWithExecutionTime("error",e,t,...r)}debugWithExecutionTime(e,t,...r){this.logWithExecutionTime("debug",e,t,...r)}info(e,...t){let r=i("info",this.appName,e,void 0,...t);this.logger.info(r)}warn(e,...t){let r=i("warn",this.appName,e,void 0,...t);this.logger.warn(r)}error(e,...t){let r=i("error",this.appName,e,void 0,...t);this.logger.error(r)}debug(e,...t){let r=i("debug",this.appName,e,void 0,...t);this.logger.debug(r)}logWithExecutionTime(e,t,r,...n){let s=(performance.now()-r.start).toFixed(2),a=i(e,this.appName,t,{name:r?.name,time:Number(s)},...n);this.logger[e](a)}};import{createLogger as V,transports as Z,format as ee}from"winston";var{combine:te,timestamp:re,printf:oe,colorize:ie}=ee,N=class{constructor(e){this.appName=d;this.logger=V({transports:[new Z.Console],format:te(ie({all:!0}),re({format:"YYYY-MM-DDThh:mm:ss"}),oe(t=>`[${t.timestamp}] ${t.level}: ${t.message}`)),...e}),this.appName=e?.appName??d}infoWithExecutionTime(e,t,...r){this.logWithExecutionTime("info",e,t,...r)}warnWithExecutionTime(e,t,...r){this.logWithExecutionTime("warn",e,t,...r)}errorWithExecutionTime(e,t,...r){this.logWithExecutionTime("error",e,t,...r)}debugWithExecutionTime(e,t,...r){this.logWithExecutionTime("debug",e,t,...r)}info(e,...t){let r=i("info",this.appName,e,void 0,...t);this.logger.info(r)}warn(e,...t){let r=i("warn",this.appName,e,void 0,...t);this.logger.warn(r)}error(e,...t){let r=i("error",this.appName,e,void 0,...t);this.logger.error(r)}debug(e,...t){let r=i("debug",this.appName,e,void 0,...t);this.logger.debug(r)}logWithExecutionTime(e,t,r,...n){let s=(performance.now()-r.start).toFixed(2),a=i(e,this.appName,t,{name:r?.name,time:Number(s)},...n);this.logger[e](a)}};function X({type:o,options:e}){switch(o){case"pino":return new v(e);case"winston":return new N(e);default:throw new Error("Invalid logger type")}}var C=class{constructor(e={type:"pino"}){this.logger=X(e)}info(e,...t){this.logger.info(e,...t)}warn(e,...t){this.logger.warn(e,...t)}error(e,...t){this.logger.error(e,...t)}debug(e,...t){this.logger.debug(e,...t)}infoWithExecutionTime(e,t,...r){this.logger.infoWithExecutionTime(e,t,...r)}warnWithExecutionTime(e,t,...r){this.logger.warnWithExecutionTime(e,t,...r)}errorWithExecutionTime(e,t,...r){this.logger.errorWithExecutionTime(e,t,...r)}debugWithExecutionTime(e,t,...r){this.logger.debugWithExecutionTime(e,t,...r)}};import ne from"express";import se from"cors";var A=ne(),j=1338,ae=/^\[(.*?)\] \[(.*?)\] \[(.*?)\] \[(.*?)\] \[(.*?)\] \[(.*?)\] \[(.*?)\]$/,ge=({logFilePath:o,corsOptions:e})=>{A.use(se(e)),A.get("/api/logs",async(t,r)=>{try{let{page:n="1",limit:s="10",level:a,traceId:g,appName:c,message:m,execution:x,searchPayload:O}=t.query,y=parseInt(n,10),u=parseInt(s,10),{total:l,data:L}=await S({logFilePath:o,logRegex:ae,page:y,limit:u,level:a,traceId:g,appName:c,message:m,execution:x,searchPayload:O});r.json({total:l,page:y,limit:u,data:L})}catch(n){console.error("Error fetching logs:",n),r.status(500).json({error:"Failed to fetch logs"})}}),A.listen(j,()=>{console.log(`Server running at http://localhost:${j}`)})};export{B as EXECUTION_LOG_CALLER,z as EXECUTION_LOG_START_TIME,C as LoggerService,W as LoggerType,p as TraceIdHandler,pt as createLogger,lt as format,S as parseLogFile,ge as startServer,We as traceMiddleware,ct as transports,P as withTraceId};