UNPKG

@notes-sync/service

Version:

Background service for AI-powered note synchronization

76 lines (61 loc) 1.98 kB
import fs from 'fs'; import path from 'path'; import * as os from 'node:os'; class LoggerClass { private logFilePath: string; private logStream: fs.WriteStream; constructor() { const logDir = path.join(os.homedir(), 'Library', 'Logs', 'NotesSync'); if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir, { recursive: true }); } this.logFilePath = path.join(logDir, 'service.log'); // Create log file if it doesn't exist if (!fs.existsSync(this.logFilePath)) { fs.writeFileSync(this.logFilePath, ''); } // Create write stream for appending this.logStream = fs.createWriteStream(this.logFilePath, { flags: 'a' }); // Setup shutdown handlers this.setupShutdownHandlers(); this.log('Logger initialized - ' + new Date().toLocaleString()); } private makeTime() { const now = new Date(); return ( now.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit', }) + '.' + now.getMilliseconds().toString().padStart(3, '0') ); } log(msg: string, ...rest: any) { const logMessage = `[DEBUG | ${this.makeTime()}] ${msg}`; console.log(logMessage, ...rest); this.logStream.write(logMessage + '\n'); } error(msg: any, ...rest: any) { const logMessage = `[ERROR | ${this.makeTime()}] ${String(msg)}`; console.error(logMessage, ...rest); this.logStream.write(logMessage + '\n'); } private setupShutdownHandlers() { const shutdown = (signal: string) => { this.log(`Received ${signal}, shutting down gracefully`); this.logStream.write('END ---\n'); this.logStream.end(() => { process.exit(0); }); }; process.on('SIGINT', () => shutdown('SIGINT')); process.on('SIGTERM', () => shutdown('SIGTERM')); process.on('exit', () => { this.logStream.write('END ---\n'); }); } } export const Logger = new LoggerClass();