UNPKG

@hoangnam.io/qa-tools

Version:

Logging, Error handling, Notifying for Express codebase

76 lines (68 loc) 2.55 kB
const { MongoClient } = require("mongodb"); const { Logging } = require("@google-cloud/logging"); const { LogLevel } = require("./constance"); const { getLoggerOptionsSchema } = require("./schema"); const noOpsLogger = { log: () => {} }; function getLogger(options) { const { consoleConfig, mongoConfig, gcConfig } = getLoggerOptionsSchema.parse(options); const consoleLogger = consoleConfig ? getConsoleLogger(consoleConfig) : noOpsLogger; const mongoLogger = mongoConfig ? getMongoLogger(mongoConfig) : noOpsLogger; const gcLogger = gcConfig ? getGGCloudLogger(gcConfig) : noOpsLogger; return { log: (logObject) => { consoleLogger.log(logObject); mongoLogger.log(logObject); gcLogger.log(logObject); }, }; } function getConsoleLogger({ mode }) { return { log: (logObject) => { const log = mode === "dev" ? logObject : JSON.stringify(logObject); if (logObject.status >= 400) console.error(log); else console.log(log); }, }; } function getMongoLogger({ connectionString, collectionName }) { const client = new MongoClient(connectionString); const connection = client.connect(); return { log: async (logObject) => { try { if (typeof logObject === "string") logObject = { logType: "MessageLog", timestamp: Date.now(), message: logObject }; const coll = (await connection).db().collection(collectionName); await coll.insertOne(logObject); } catch (error) { console.error(`MongoLogger log failed: ${error.toString()}`); } }, }; } function getGGCloudLogger({ projectId, keyFilename, logName }) { const logging = new Logging({ projectId, keyFilename }); const logger = logging.log(logName); return { log: async (logObject) => { try { const enrichedLog = addGCTraceInfo(projectId, 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 logging 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 = { getConsoleLogger, getMongoLogger, getGGCloudLogger, getLogger };