118 lines
3.5 KiB
TypeScript
118 lines
3.5 KiB
TypeScript
|
|
/**
|
||
|
|
* Adaptive SMTP Logging System
|
||
|
|
* Automatically switches between logging modes based on server load (active connections)
|
||
|
|
* to maintain performance during high-concurrency scenarios
|
||
|
|
*/
|
||
|
|
import * as plugins from '../../../../plugins.js';
|
||
|
|
import { SecurityLogLevel, SecurityEventType } from '../constants.js';
|
||
|
|
import type { ISmtpSession } from '../interfaces.js';
|
||
|
|
import type { LogLevel, ISmtpLogOptions } from './logging.js';
|
||
|
|
/**
|
||
|
|
* Log modes based on server load
|
||
|
|
*/
|
||
|
|
export declare enum LogMode {
|
||
|
|
VERBOSE = "VERBOSE",// < 20 connections: Full detailed logging
|
||
|
|
REDUCED = "REDUCED",// 20-40 connections: Limited command/response logging, full error logging
|
||
|
|
MINIMAL = "MINIMAL"
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Configuration for adaptive logging thresholds
|
||
|
|
*/
|
||
|
|
export interface IAdaptiveLogConfig {
|
||
|
|
verboseThreshold: number;
|
||
|
|
reducedThreshold: number;
|
||
|
|
aggregationInterval: number;
|
||
|
|
maxAggregatedEntries: number;
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Connection metadata for aggregation tracking
|
||
|
|
*/
|
||
|
|
interface IConnectionTracker {
|
||
|
|
activeConnections: number;
|
||
|
|
peakConnections: number;
|
||
|
|
totalConnections: number;
|
||
|
|
connectionsPerSecond: number;
|
||
|
|
lastConnectionTime: number;
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Adaptive SMTP Logger that scales logging based on server load
|
||
|
|
*/
|
||
|
|
export declare class AdaptiveSmtpLogger {
|
||
|
|
private static instance;
|
||
|
|
private currentMode;
|
||
|
|
private config;
|
||
|
|
private aggregatedEntries;
|
||
|
|
private aggregationTimer;
|
||
|
|
private connectionTracker;
|
||
|
|
private constructor();
|
||
|
|
/**
|
||
|
|
* Get singleton instance
|
||
|
|
*/
|
||
|
|
static getInstance(config?: Partial<IAdaptiveLogConfig>): AdaptiveSmtpLogger;
|
||
|
|
/**
|
||
|
|
* Update active connection count and adjust log mode if needed
|
||
|
|
*/
|
||
|
|
updateConnectionCount(activeConnections: number): void;
|
||
|
|
/**
|
||
|
|
* Track new connection for rate calculation
|
||
|
|
*/
|
||
|
|
trackConnection(): void;
|
||
|
|
/**
|
||
|
|
* Get current logging mode
|
||
|
|
*/
|
||
|
|
getCurrentMode(): LogMode;
|
||
|
|
/**
|
||
|
|
* Get connection statistics
|
||
|
|
*/
|
||
|
|
getConnectionStats(): IConnectionTracker;
|
||
|
|
/**
|
||
|
|
* Log a message with adaptive behavior
|
||
|
|
*/
|
||
|
|
log(level: LogLevel, message: string, options?: ISmtpLogOptions): void;
|
||
|
|
/**
|
||
|
|
* Log command with adaptive behavior
|
||
|
|
*/
|
||
|
|
logCommand(command: string, socket: plugins.net.Socket | plugins.tls.TLSSocket, session?: ISmtpSession): void;
|
||
|
|
/**
|
||
|
|
* Log response with adaptive behavior
|
||
|
|
*/
|
||
|
|
logResponse(response: string, socket: plugins.net.Socket | plugins.tls.TLSSocket): void;
|
||
|
|
/**
|
||
|
|
* Log connection event with adaptive behavior
|
||
|
|
*/
|
||
|
|
logConnection(socket: plugins.net.Socket | plugins.tls.TLSSocket, eventType: 'connect' | 'close' | 'error', session?: ISmtpSession, error?: Error): void;
|
||
|
|
/**
|
||
|
|
* Log security event (always logged regardless of mode)
|
||
|
|
*/
|
||
|
|
logSecurityEvent(level: SecurityLogLevel, type: SecurityEventType, message: string, details: Record<string, any>, ipAddress?: string, domain?: string, success?: boolean): void;
|
||
|
|
/**
|
||
|
|
* Determine appropriate log mode based on connection count
|
||
|
|
*/
|
||
|
|
private determineLogMode;
|
||
|
|
/**
|
||
|
|
* Switch to a new log mode
|
||
|
|
*/
|
||
|
|
private switchLogMode;
|
||
|
|
/**
|
||
|
|
* Add entry to aggregation buffer
|
||
|
|
*/
|
||
|
|
private aggregateEntry;
|
||
|
|
/**
|
||
|
|
* Start the aggregation timer
|
||
|
|
*/
|
||
|
|
private startAggregationTimer;
|
||
|
|
/**
|
||
|
|
* Flush aggregated entries to logs
|
||
|
|
*/
|
||
|
|
private flushAggregatedEntries;
|
||
|
|
/**
|
||
|
|
* Cleanup resources
|
||
|
|
*/
|
||
|
|
destroy(): void;
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Default instance for easy access
|
||
|
|
*/
|
||
|
|
export declare const adaptiveLogger: AdaptiveSmtpLogger;
|
||
|
|
export {};
|