140 lines
4.4 KiB
JavaScript
140 lines
4.4 KiB
JavaScript
// Load environment variables THIS MUST BE AT THE TOP
|
|
const path = require("path");
|
|
require("dotenv").config({
|
|
path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`)
|
|
});
|
|
|
|
const InstanceManager = require("../utils/instanceMgr").default;
|
|
const winston = require("winston");
|
|
const WinstonCloudWatch = require("winston-cloudwatch");
|
|
const { isString, isEmpty } = require("lodash");
|
|
const { networkInterfaces, hostname } = require("node:os");
|
|
|
|
const createLogger = () => {
|
|
try {
|
|
const isLocal = isString(process.env?.LOCALSTACK_HOSTNAME) && !isEmpty(process.env?.LOCALSTACK_HOSTNAME);
|
|
const logGroupName = isLocal ? "development" : process.env.CLOUDWATCH_LOG_GROUP;
|
|
|
|
const winstonCloudwatchTransportDefaults = {
|
|
logGroupName: logGroupName,
|
|
awsOptions: {
|
|
region: InstanceManager({
|
|
imex: "ca-central-1",
|
|
rome: "us-east-2"
|
|
})
|
|
},
|
|
jsonMessage: true
|
|
};
|
|
|
|
if (isLocal) {
|
|
winstonCloudwatchTransportDefaults.awsOptions.endpoint = `http://${process.env.LOCALSTACK_HOSTNAME}:4566`;
|
|
}
|
|
|
|
const levelFilter = (levels) => {
|
|
return winston.format((info) => {
|
|
if (Array.isArray(levels)) {
|
|
return levels.includes(info.level) ? info : false;
|
|
} else {
|
|
return info.level === levels ? info : false;
|
|
}
|
|
})();
|
|
};
|
|
|
|
const getHostNameOrIP = () => {
|
|
// Try to get the hostname first
|
|
const hostName = hostname();
|
|
if (hostName) return hostName;
|
|
|
|
const interfaces = networkInterfaces();
|
|
for (const name of Object.keys(interfaces)) {
|
|
for (const iface of interfaces[name]) {
|
|
if (iface.family === "IPv4" && !iface.internal) {
|
|
return iface.address;
|
|
}
|
|
}
|
|
}
|
|
|
|
return "127.0.0.1";
|
|
};
|
|
const createProductionTransport = (level, logStreamName, filters) => {
|
|
return new WinstonCloudWatch({
|
|
level,
|
|
logStreamName: logStreamName || level,
|
|
format: levelFilter(filters || level),
|
|
...winstonCloudwatchTransportDefaults
|
|
});
|
|
};
|
|
|
|
const hostname = process.env.HOSTNAME || getHostNameOrIP();
|
|
|
|
const getDevelopmentTransports = () => [
|
|
new winston.transports.Console({
|
|
level: "silly",
|
|
format: winston.format.combine(
|
|
winston.format.colorize(),
|
|
winston.format.timestamp(),
|
|
winston.format.printf(({ level, message, timestamp, user, record, meta }) => {
|
|
const hostnameColor = `\x1b[34m${hostname}\x1b[0m`; // Blue
|
|
const timestampColor = `\x1b[36m${timestamp}\x1b[0m`; // Cyan
|
|
const labelColor = "\x1b[33m"; // Yellow
|
|
const separatorColor = "\x1b[35m|\x1b[0m"; // Magenta for separators
|
|
|
|
return `${timestampColor} [${hostnameColor}] [${level}]: ${message} ${
|
|
user ? `${separatorColor} ${labelColor}user:\x1b[0m ${JSON.stringify(user)}` : ""
|
|
} ${record ? `${separatorColor} ${labelColor}record:\x1b[0m ${JSON.stringify(record)}` : ""}${
|
|
meta
|
|
? `\n${separatorColor} ${labelColor}meta:\x1b[0m ${JSON.stringify(meta, null, 2)} ${separatorColor}`
|
|
: ""
|
|
}`;
|
|
})
|
|
)
|
|
})
|
|
];
|
|
|
|
const getProductionTransports = () => [
|
|
createProductionTransport("error"),
|
|
createProductionTransport("warn"),
|
|
createProductionTransport("info"),
|
|
createProductionTransport("silly", "debug", ["http", "verbose", "debug", "silly"])
|
|
];
|
|
|
|
const winstonLogger = winston.createLogger({
|
|
format: winston.format.json(),
|
|
transports:
|
|
process.env.NODE_ENV === "production"
|
|
? getProductionTransports()
|
|
: [...getDevelopmentTransports(), ...getProductionTransports()]
|
|
});
|
|
|
|
if (isLocal) {
|
|
winstonLogger.debug(
|
|
`CloudWatch set to LocalStack end point: ${winstonCloudwatchTransportDefaults.awsOptions.endpoint}`
|
|
);
|
|
}
|
|
|
|
const log = (message, type, user, record, meta) => {
|
|
winstonLogger.log({
|
|
level: type.toLowerCase(),
|
|
message,
|
|
user,
|
|
record,
|
|
hostname,
|
|
meta
|
|
});
|
|
};
|
|
|
|
return {
|
|
log,
|
|
logger: winstonLogger
|
|
};
|
|
} catch (e) {
|
|
console.error("Error setting up enhanced Logger, defaulting to console.: " + e?.message || "");
|
|
return {
|
|
log: console.log,
|
|
logger: console.log
|
|
};
|
|
}
|
|
};
|
|
|
|
module.exports = createLogger();
|