coddyger
Version:
Coddyger est une bibliothèque JavaScript/TypeScript qui fournit des fonctions communes et des plugins pour la gestion des données, la communication entre services, et des utilitaires avancés pour le développement d'applications.
189 lines (188 loc) • 7.07 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.LoggerService = exports.LogLevel = void 0;
const path = __importStar(require("path"));
const fs = __importStar(require("fs"));
const pino_1 = __importDefault(require("pino"));
const coddyger_1 = __importDefault(require("../coddyger"));
var LogLevel;
(function (LogLevel) {
LogLevel["Info"] = "info";
LogLevel["Debug"] = "debug";
LogLevel["Warn"] = "warn";
LogLevel["Error"] = "error";
LogLevel["Fatal"] = "fatal";
LogLevel["Trace"] = "trace";
})(LogLevel || (exports.LogLevel = LogLevel = {}));
class LoggerService {
static getInstance() {
if (!LoggerService.instance) {
const isProduction = process.env.NODE_ENV === 'production';
const currentDate = coddyger_1.default.dateOnlyFormat(new Date().toISOString());
LoggerService.logDirectory = path.join(coddyger_1.default.root(), '/src/logs/');
// Création du répertoire de logs s'il n'existe pas
if (!fs.existsSync(LoggerService.logDirectory)) {
fs.mkdirSync(LoggerService.logDirectory, { recursive: true });
}
const transport = pino_1.default.transport({
targets: [
// Fichier de logs pour tous les niveaux
{
target: 'pino/file',
options: {
destination: path.join(LoggerService.logDirectory, `${currentDate}.log`),
mkdir: true
},
level: 'trace'
},
// Fichier séparé pour les erreurs
{
target: 'pino/file',
options: {
destination: path.join(LoggerService.logDirectory, `${currentDate}-error.log`),
mkdir: true
},
level: 'error'
},
// Console avec formatage pretty en développement
{
target: 'pino-pretty',
options: {
colorize: true,
translateTime: 'SYS:standard',
ignore: 'pid,hostname',
},
level: isProduction ? 'info' : 'debug'
}
]
});
LoggerService.instance = (0, pino_1.default)({
level: isProduction ? 'info' : 'debug',
timestamp: pino_1.default.stdTimeFunctions.isoTime,
formatters: {
level: (label) => {
return { level: label.toUpperCase() };
}
},
redact: {
paths: ['password', 'token', 'secret', '*.password', '*.token', '*.secret'],
remove: true
}
}, transport);
}
return LoggerService.instance;
}
static log(payload) {
const { type, content, location, method, context = {} } = payload;
const logger = LoggerService.getInstance();
const logData = Object.assign(Object.assign({ location,
method }, context), { msg: typeof content === 'string' ? content : JSON.stringify(content) });
switch (type) {
case LogLevel.Debug:
logger.debug(logData);
break;
case LogLevel.Info:
logger.info(logData);
break;
case LogLevel.Warn:
logger.warn(logData);
break;
case LogLevel.Error:
logger.error(logData);
break;
case LogLevel.Fatal:
logger.fatal(logData);
break;
case LogLevel.Trace:
logger.trace(logData);
break;
default:
logger.error(Object.assign(Object.assign({}, logData), { msg: 'Invalid log type' }));
}
}
// Méthodes utilitaires pour un logging plus simple
static debug(message, context) {
this.log({
type: LogLevel.Debug,
content: message,
location: 'app',
method: 'debug',
context
});
}
static info(message, context) {
this.log({
type: LogLevel.Info,
content: message,
location: 'app',
method: 'info',
context
});
}
static warn(message, context) {
this.log({
type: LogLevel.Warn,
content: message,
location: 'app',
method: 'warn',
context
});
}
static error(message, context) {
const errorMessage = message instanceof Error ? message.stack || message.message : message;
this.log({
type: LogLevel.Error,
content: errorMessage,
location: 'app',
method: 'error',
context
});
}
static fatal(message, context) {
const errorMessage = message instanceof Error ? message.stack || message.message : message;
this.log({
type: LogLevel.Fatal,
content: errorMessage,
location: 'app',
method: 'fatal',
context
});
}
}
exports.LoggerService = LoggerService;