endpoint-sentinel
Version:
User-friendly security scanner with interactive setup that scales from beginner to expert
212 lines • 6.34 kB
JavaScript
;
/**
* Enterprise Logging System
* Provides structured logging with audit capabilities
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SecurityLogger = void 0;
exports.createLogger = createLogger;
exports.createTestLogger = createTestLogger;
exports.createProductionLogger = createProductionLogger;
const winston_1 = __importDefault(require("winston"));
/**
* Production-ready logger implementation
*/
class SecurityLogger {
winstonLogger;
auditLogger;
config;
constructor(config = {}) {
this.config = {
level: config.level || 'info',
auditEnabled: config.auditEnabled || false,
outputFile: config.outputFile || 'endpoint-sentinel.log',
format: config.format || 'json'
};
this.winstonLogger = this.createMainLogger();
this.auditLogger = this.createAuditLogger();
}
/**
* Creates the main application logger
*/
createMainLogger() {
const formats = [
winston_1.default.format.timestamp(),
winston_1.default.format.errors({ stack: true }),
winston_1.default.format.metadata()
];
if (this.config.format === 'json') {
formats.push(winston_1.default.format.json());
}
else {
formats.push(winston_1.default.format.printf(({ timestamp, level, message, metadata }) => {
const meta = metadata && typeof metadata === 'object' && Object.keys(metadata).length > 0 ? ` ${JSON.stringify(metadata)}` : '';
return `${timestamp} [${level.toUpperCase()}] ${message}${meta}`;
}));
}
return winston_1.default.createLogger({
level: this.config.level,
format: winston_1.default.format.combine(...formats),
transports: [
new winston_1.default.transports.Console({
level: this.config.level,
silent: process.env.NODE_ENV === 'test'
}),
new winston_1.default.transports.File({
filename: this.config.outputFile,
level: 'debug'
})
],
exitOnError: false
});
}
/**
* Creates dedicated audit logger for compliance
*/
createAuditLogger() {
return winston_1.default.createLogger({
level: 'info',
format: winston_1.default.format.combine(winston_1.default.format.timestamp(), winston_1.default.format.json()),
transports: [
new winston_1.default.transports.File({
filename: 'audit.log',
level: 'info'
})
],
exitOnError: false
});
}
/**
* Log info message
*/
info(message, meta) {
this.winstonLogger.info(message, meta);
}
/**
* Log warning message
*/
warn(message, meta) {
this.winstonLogger.warn(message, meta);
}
/**
* Log error message with optional error object
*/
error(message, error, meta) {
const errorMeta = error ? {
error: {
name: error.name,
message: error.message,
stack: error.stack
}
} : {};
this.winstonLogger.error(message, { ...errorMeta, ...meta });
}
/**
* Log debug message
*/
debug(message, meta) {
this.winstonLogger.debug(message, meta);
}
/**
* Log audit event for compliance and security monitoring
*/
audit(event) {
if (!this.config.auditEnabled) {
return;
}
const auditRecord = {
...event,
severity: this.getAuditSeverity(event.eventType),
source: 'endpoint-sentinel',
version: '1.0.0'
};
this.auditLogger.info('AUDIT_EVENT', auditRecord);
// Also log to main logger for visibility
this.info(`Audit: ${event.eventType}`, {
target: event.target,
sessionId: event.sessionId
});
}
/**
* Determines audit severity based on event type
*/
getAuditSeverity(eventType) {
switch (eventType) {
case 'vulnerability_found':
return 'high';
case 'scan_started':
case 'scan_completed':
return 'medium';
case 'consent_granted':
case 'endpoint_discovered':
return 'low';
case 'error_occurred':
case 'scan_terminated':
return 'high';
default:
return 'medium';
}
}
/**
* Creates a child logger with additional context
*/
child(context) {
const childLogger = new SecurityLogger(this.config);
childLogger.winstonLogger = this.winstonLogger.child(context);
return childLogger;
}
/**
* Flushes all pending log writes
*/
async flush() {
return new Promise((resolve) => {
this.winstonLogger.on('finish', resolve);
this.winstonLogger.end();
});
}
/**
* Changes log level dynamically
*/
setLevel(level) {
this.config.level = level;
this.winstonLogger.level = level;
}
/**
* Gets current log level
*/
getLevel() {
return this.config.level;
}
}
exports.SecurityLogger = SecurityLogger;
/**
* Logger factory for creating configured logger instances
*/
function createLogger(config = {}) {
return new SecurityLogger(config);
}
/**
* Creates a logger for testing with minimal output
*/
function createTestLogger() {
return new SecurityLogger({
level: 'error',
auditEnabled: false,
format: 'text'
});
}
/**
* Creates a logger optimized for production use
*/
function createProductionLogger(outputFile) {
return new SecurityLogger({
level: 'info',
auditEnabled: true,
outputFile: outputFile || '/var/log/endpoint-sentinel/app.log',
format: 'json'
});
}
//# sourceMappingURL=logger.js.map