Files
agregarr/server/logger.ts
2025-09-02 23:58:08 +12:00

100 lines
2.9 KiB
TypeScript

import fs from 'fs';
import path from 'path';
import * as winston from 'winston';
import 'winston-daily-rotate-file';
// Migrate away from old log
const OLD_LOG_FILE = path.join(__dirname, '../config/logs/agregarr.log');
if (fs.existsSync(OLD_LOG_FILE)) {
const file = fs.lstatSync(OLD_LOG_FILE);
if (!file.isSymbolicLink()) {
fs.unlinkSync(OLD_LOG_FILE);
}
}
const hformat = winston.format.printf(
({ level, label, message, timestamp, ...metadata }) => {
let msg = `${timestamp} [${level}]${
label ? `[${label}]` : ''
}: ${message} `;
if (Object.keys(metadata).length > 0) {
try {
msg += JSON.stringify(metadata);
} catch (error) {
// Handle circular references by using a replacer function
msg += JSON.stringify(metadata, (key, value) => {
if (typeof value === 'object' && value !== null) {
// For Error objects, extract useful properties
if (value instanceof Error) {
return {
name: value.name,
message: value.message,
stack: value.stack,
};
}
// Skip circular references and complex objects like HTTP agents
if (
value.constructor &&
(value.constructor.name === 'Agent' ||
value.constructor.name === 'ClientRequest')
) {
return '[Circular Reference]';
}
}
return value;
});
}
}
return msg;
}
);
const logger = winston.createLogger({
level: process.env.LOG_LEVEL?.toLowerCase() || 'debug',
format: winston.format.combine(
winston.format.splat(),
winston.format.timestamp(),
hformat
),
transports: [
new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(),
winston.format.splat(),
winston.format.timestamp(),
hformat
),
}),
new winston.transports.DailyRotateFile({
filename: process.env.CONFIG_DIRECTORY
? `${process.env.CONFIG_DIRECTORY}/logs/agregarr-%DATE%.log`
: path.join(__dirname, '../config/logs/agregarr-%DATE%.log'),
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '7d',
createSymlink: true,
symlinkName: 'agregarr.log',
}),
new winston.transports.DailyRotateFile({
filename: process.env.CONFIG_DIRECTORY
? `${process.env.CONFIG_DIRECTORY}/logs/.machinelogs-%DATE%.json`
: path.join(__dirname, '../config/logs/.machinelogs-%DATE%.json'),
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '1d',
createSymlink: true,
symlinkName: '.machinelogs.json',
format: winston.format.combine(
winston.format.splat(),
winston.format.timestamp(),
winston.format.json()
),
}),
],
});
export default logger;