UNPKG

@hoangnam.io/qa-tools

Version:

Logging, Error handling, Notifying for Express codebase

74 lines (67 loc) 2.45 kB
const { MongoClient } = require("mongodb"); const { Logging } = require("@google-cloud/logging"); const { LogLevel } = require("./constance"); const noOpsLogger = { log: () => {} }; function getLogger({ mongoConfig, enableConsoleLog = true, gcProjectId, logName = "request_logs" }) { const mongoLogger = getMongoLogger(mongoConfig); const consoleLogger = getConsoleLogger(enableConsoleLog, gcProjectId); const gcLogger = getGGCloudLogger(gcProjectId, logName); return { log: (logObject) => { consoleLogger.log(logObject); gcLogger.log(logObject); mongoLogger.log(logObject); }, }; } function getMongoLogger(mongoConfig) { if (!mongoConfig.connectionString) return noOpsLogger; const client = new MongoClient(mongoConfig.connectionString); const connection = client.connect(); return { log: async (logObject) => { try { const coll = (await connection).db().collection(mongoConfig.collectionName); await coll.insertOne(logObject); } catch (error) { console.error(`MongoLogger log failed: ${error.toString()}`); } }, }; } function getConsoleLogger(enableConsoleLog, gcProjectId) { if (!enableConsoleLog) return noOpsLogger; return { log: (logObject) => { const enrichedLog = addGCTraceInfo(gcProjectId, logObject); if (enrichedLog.status >= 400) console.error(enrichedLog); else console.log(enrichedLog); }, }; } function getGGCloudLogger(gcProjectId, logName = "logs") { if (!process.env.GOOGLE_APPLICATION_CREDENTIALS) return noOpsLogger; const logging = new Logging(); const logger = logging.log(logName); return { log: async (logObject) => { try { const enrichedLog = addGCTraceInfo(gcProjectId, logObject); const severity = enrichedLog.status >= 400 ? LogLevel.ERROR : LogLevel.INFO; const jsonEntry = logger.entry({ severity }, enrichedLog); await logger.write(jsonEntry); } catch (error) { console.error(`GGCloudLogger log failed: ${error.toString()}`); } }, }; } function addGCTraceInfo(gcProjectId, logObject) { if (!gcProjectId || !logObject.traceId) return logObject; return { ...logObject, "logging.googleapis.com/trace": `projects/${gcProjectId}/traces/${logObject.traceId}`, "logging.googleapis.com/spanId": logObject.spanId, }; } module.exports = { getMongoLogger, getConsoleLogger, getGGCloudLogger, getLogger };