@hoangnam.io/qa-tools
Version:
Logging, Error handling, Notifying for Express codebase
74 lines (67 loc) • 2.45 kB
JavaScript
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 };