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