brainy/src/utils/enhancedLogger.ts
David Snelling ce2bc76648 feat: Brainy 3.0 - Triple Intelligence Release
BREAKING CHANGE: New unified API for vector, graph, and document search

Major Changes:
- NEW: brain.add() replaces brain.addNoun()
- NEW: brain.find() replaces brain.search()
- NEW: brain.relate() replaces brain.addVerb()
- NEW: brain.update() replaces brain.updateNoun()
- NEW: brain.delete() replaces brain.deleteNoun()

Features:
- Triple Intelligence™ engine (vector + graph + document)
- 31 NounTypes × 40 VerbTypes for universal knowledge modeling
- Zero-config parameter validation
- Enhanced augmentation system (cache, display, metrics)
- <10ms search performance with HNSW indexing
- Full TypeScript type safety

Infrastructure:
- Comprehensive test suites for find() and neural APIs
- Fixed neural API internal calls (getNoun → get)
- Updated README with accurate 3.0 examples
- ESLint v9 configuration
- Structured logging framework

🧠 Generated with Brainy 3.0

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-15 11:06:16 -07:00

296 lines
No EOL
9.2 KiB
TypeScript

/**
* Enhanced logging system that bridges old logger with new structured logger
* Provides backward compatibility while enabling gradual migration
*/
import {
structuredLogger,
createModuleLogger as createStructuredModuleLogger,
LogLevel as StructuredLogLevel,
type LogContext,
type ModuleLogger
} from './structuredLogger.js'
import { isProductionEnvironment, getLogLevel } from './environment.js'
// Re-export LogLevel for compatibility
export enum LogLevel {
ERROR = 0,
WARN = 1,
INFO = 2,
DEBUG = 3,
TRACE = 4
}
// Map old LogLevel to new StructuredLogLevel
function mapLogLevel(level: LogLevel): StructuredLogLevel {
switch (level) {
case LogLevel.ERROR: return StructuredLogLevel.ERROR
case LogLevel.WARN: return StructuredLogLevel.WARN
case LogLevel.INFO: return StructuredLogLevel.INFO
case LogLevel.DEBUG: return StructuredLogLevel.DEBUG
case LogLevel.TRACE: return StructuredLogLevel.TRACE
default: return StructuredLogLevel.INFO
}
}
export interface LoggerConfig {
level: LogLevel
modules?: {
[moduleName: string]: LogLevel
}
timestamps?: boolean
includeModule?: boolean
handler?: (level: LogLevel, module: string, message: string, ...args: any[]) => void
}
/**
* Enhanced Logger that uses structured logger internally
* Maintains backward compatibility with existing code
*/
class EnhancedLogger {
private static instance: EnhancedLogger
private config: LoggerConfig = {
level: LogLevel.ERROR,
timestamps: false,
includeModule: true
}
private constructor() {
this.applyEnvironmentDefaults()
// Sync with structured logger
this.syncWithStructuredLogger()
// Set log level from environment variable if available
const envLogLevel = process.env.BRAINY_LOG_LEVEL
if (envLogLevel) {
const level = LogLevel[envLogLevel.toUpperCase() as keyof typeof LogLevel]
if (level !== undefined) {
this.config.level = level
this.syncWithStructuredLogger()
}
}
// Parse module-specific log levels
const moduleLogLevels = process.env.BRAINY_MODULE_LOG_LEVELS
if (moduleLogLevels) {
try {
this.config.modules = JSON.parse(moduleLogLevels)
this.syncWithStructuredLogger()
} catch (e) {
// Ignore parsing errors
}
}
}
private applyEnvironmentDefaults(): void {
const envLogLevel = getLogLevel()
switch (envLogLevel) {
case 'silent':
this.config.level = -1 as LogLevel
break
case 'error':
this.config.level = LogLevel.ERROR
this.config.timestamps = false
break
case 'warn':
this.config.level = LogLevel.WARN
this.config.timestamps = false
break
case 'info':
this.config.level = LogLevel.INFO
this.config.timestamps = true
break
case 'verbose':
this.config.level = LogLevel.DEBUG
this.config.timestamps = true
break
}
if (isProductionEnvironment()) {
this.config.level = Math.min(this.config.level, LogLevel.ERROR)
this.config.timestamps = false
this.config.includeModule = false
}
}
private syncWithStructuredLogger(): void {
// Convert modules config
const modules: Record<string, StructuredLogLevel> = {}
if (this.config.modules) {
for (const [module, level] of Object.entries(this.config.modules)) {
modules[module] = mapLogLevel(level)
}
}
// Configure structured logger
structuredLogger.configure({
level: mapLogLevel(this.config.level),
modules,
format: this.config.timestamps ? 'pretty' : 'simple'
})
}
static getInstance(): EnhancedLogger {
if (!EnhancedLogger.instance) {
EnhancedLogger.instance = new EnhancedLogger()
}
return EnhancedLogger.instance
}
configure(config: Partial<LoggerConfig>): void {
this.config = { ...this.config, ...config }
this.syncWithStructuredLogger()
}
private shouldLog(level: LogLevel, module: string): boolean {
if (this.config.modules && this.config.modules[module] !== undefined) {
return level <= this.config.modules[module]
}
return level <= this.config.level
}
error(module: string, message: string, ...args: any[]): void {
const logger = createStructuredModuleLogger(module)
logger.error(message, { data: args })
}
warn(module: string, message: string, ...args: any[]): void {
const logger = createStructuredModuleLogger(module)
logger.warn(message, { data: args })
}
info(module: string, message: string, ...args: any[]): void {
const logger = createStructuredModuleLogger(module)
logger.info(message, { data: args })
}
debug(module: string, message: string, ...args: any[]): void {
const logger = createStructuredModuleLogger(module)
logger.debug(message, { data: args })
}
trace(module: string, message: string, ...args: any[]): void {
const logger = createStructuredModuleLogger(module)
logger.trace(message, { data: args })
}
createModuleLogger(module: string) {
const structuredLogger = createStructuredModuleLogger(module)
// Return a backward-compatible interface
return {
error: (message: string, ...args: any[]) =>
structuredLogger.error(message, { data: args }),
warn: (message: string, ...args: any[]) =>
structuredLogger.warn(message, { data: args }),
info: (message: string, ...args: any[]) =>
structuredLogger.info(message, { data: args }),
debug: (message: string, ...args: any[]) =>
structuredLogger.debug(message, { data: args }),
trace: (message: string, ...args: any[]) =>
structuredLogger.trace(message, { data: args }),
// New structured logging methods
withContext: (context: LogContext) =>
structuredLogger.withContext(context),
startTimer: (label: string) =>
structuredLogger.startTimer(label),
endTimer: (label: string) =>
structuredLogger.endTimer(label)
}
}
}
// Export singleton instance
export const logger = EnhancedLogger.getInstance()
// Export convenience function for creating module loggers
export function createModuleLogger(module: string) {
return logger.createModuleLogger(module)
}
// Export function to configure logger
export function configureLogger(config: Partial<LoggerConfig>) {
logger.configure(config)
}
/**
* Smart console replacement that uses structured logger
*/
export const smartConsole = {
log: (message?: any, ...args: any[]) => {
const logger = createStructuredModuleLogger('console')
logger.info(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
},
info: (message?: any, ...args: any[]) => {
const logger = createStructuredModuleLogger('console')
logger.info(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
},
warn: (message?: any, ...args: any[]) => {
const logger = createStructuredModuleLogger('console')
logger.warn(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
},
error: (message?: any, ...args: any[]) => {
const logger = createStructuredModuleLogger('console')
logger.error(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
},
debug: (message?: any, ...args: any[]) => {
const logger = createStructuredModuleLogger('console')
logger.debug(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
},
trace: (message?: any, ...args: any[]) => {
const logger = createStructuredModuleLogger('console')
logger.trace(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
}
}
/**
* Production-optimized logging functions
*/
export const prodLog = {
error: (message?: any, ...args: any[]) => {
const logger = createStructuredModuleLogger('prod')
logger.error(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
},
warn: (message?: any, ...args: any[]) => {
if (!isProductionEnvironment() || process.env.BRAINY_LOG_LEVEL) {
const logger = createStructuredModuleLogger('prod')
logger.warn(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
}
},
info: (message?: any, ...args: any[]) => {
if (!isProductionEnvironment() || process.env.BRAINY_LOG_LEVEL) {
const logger = createStructuredModuleLogger('prod')
logger.info(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
}
},
debug: (message?: any, ...args: any[]) => {
if (!isProductionEnvironment() || process.env.BRAINY_LOG_LEVEL) {
const logger = createStructuredModuleLogger('prod')
logger.debug(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
}
},
log: (message?: any, ...args: any[]) => {
if (!isProductionEnvironment() || process.env.BRAINY_LOG_LEVEL) {
const logger = createStructuredModuleLogger('prod')
logger.info(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
}
}
}
// Re-export structured logger utilities for new code
export {
createModuleLogger as createStructuredModuleLogger,
type LogContext,
type ModuleLogger
} from './structuredLogger.js'