fix(logger): Replace direct console logging with unified logger interface for consistent formatting

This commit is contained in:
2025-03-26 22:28:38 +00:00
parent 03056d279d
commit f3de3f0618
9 changed files with 157 additions and 106 deletions

View File

@@ -4,6 +4,7 @@ import { exec, execFile } from 'child_process';
import { promisify } from 'util';
import { NupstSnmp } from './snmp/manager.js';
import type { ISnmpConfig } from './snmp/types.js';
import { logger } from './logger.js';
const execAsync = promisify(exec);
const execFileAsync = promisify(execFile);
@@ -147,11 +148,11 @@ export class NupstDaemon {
*/
public async start(): Promise<void> {
if (this.isRunning) {
console.log('Daemon is already running');
logger.log('Daemon is already running');
return;
}
console.log('Starting NUPST daemon...');
logger.log('Starting NUPST daemon...');
try {
// Load configuration - this will throw an error if config doesn't exist
@@ -165,11 +166,12 @@ export class NupstDaemon {
this.snmp.getNupst().checkForUpdates().then(updateAvailable => {
if (updateAvailable) {
const updateStatus = this.snmp.getNupst().getUpdateStatus();
console.log('┌─ Update Available ───────────────────────┐');
console.log(`│ Current Version: ${updateStatus.currentVersion}`);
console.log(`│ Latest Version: ${updateStatus.latestVersion}`);
console.log('│ Run "sudo nupst update" to update');
console.log('└──────────────────────────────────────────┘');
const boxWidth = 45;
logger.logBoxTitle('Update Available', boxWidth);
logger.logBoxLine(`Current Version: ${updateStatus.currentVersion}`);
logger.logBoxLine(`Latest Version: ${updateStatus.latestVersion}`);
logger.logBoxLine('Run "sudo nupst update" to update');
logger.logBoxEnd();
}
}).catch(() => {}); // Ignore errors checking for updates
@@ -178,7 +180,7 @@ export class NupstDaemon {
await this.monitor();
} catch (error) {
this.isRunning = false;
console.error(`Daemon failed to start: ${error.message}`);
logger.error(`Daemon failed to start: ${error.message}`);
process.exit(1); // Exit with error
}
}
@@ -187,23 +189,24 @@ export class NupstDaemon {
* Log the loaded configuration settings
*/
private logConfigLoaded(): void {
console.log('┌─ Configuration Loaded ─────────────────────┐');
console.log('│ SNMP Settings:');
console.log(`│ Host: ${this.config.snmp.host}`);
console.log(` Port: ${this.config.snmp.port}`);
console.log(`│ Version: ${this.config.snmp.version}`);
console.log('│ Thresholds:');
console.log(`│ Battery: ${this.config.thresholds.battery}%`);
console.log(`│ Runtime: ${this.config.thresholds.runtime} minutes`);
console.log(`│ Check Interval: ${this.config.checkInterval / 1000} seconds`);
console.log('└────────────────────────────────────────────┘');
const boxWidth = 50;
logger.logBoxTitle('Configuration Loaded', boxWidth);
logger.logBoxLine('SNMP Settings:');
logger.logBoxLine(` Host: ${this.config.snmp.host}`);
logger.logBoxLine(` Port: ${this.config.snmp.port}`);
logger.logBoxLine(` Version: ${this.config.snmp.version}`);
logger.logBoxLine('Thresholds:');
logger.logBoxLine(` Battery: ${this.config.thresholds.battery}%`);
logger.logBoxLine(` Runtime: ${this.config.thresholds.runtime} minutes`);
logger.logBoxLine(`Check Interval: ${this.config.checkInterval / 1000} seconds`);
logger.logBoxEnd();
}
/**
* Stop the monitoring daemon
*/
public stop(): void {
console.log('Stopping NUPST daemon...');
logger.log('Stopping NUPST daemon...');
this.isRunning = false;
}
@@ -211,7 +214,7 @@ export class NupstDaemon {
* Monitor the UPS status and trigger shutdown when necessary
*/
private async monitor(): Promise<void> {
console.log('Starting UPS monitoring...');
logger.log('Starting UPS monitoring...');
let lastStatus: 'online' | 'onBattery' | 'unknown' = 'unknown';
let lastLogTime = 0; // Track when we last logged status
@@ -226,20 +229,22 @@ export class NupstDaemon {
// Log status changes
if (status.powerStatus !== lastStatus) {
console.log('┌─ Power Status Change ─────────────────────┐');
console.log(` Status changed: ${lastStatus}${status.powerStatus}`);
console.log('└───────────────────────────────────────────┘');
const statusBoxWidth = 45;
logger.logBoxTitle('Power Status Change', statusBoxWidth);
logger.logBoxLine(`Status changed: ${lastStatus}${status.powerStatus}`);
logger.logBoxEnd();
lastStatus = status.powerStatus;
lastLogTime = currentTime; // Reset log timer when status changes
}
// Log status periodically (at least every 5 minutes)
else if (shouldLogStatus) {
const timestamp = new Date().toISOString();
console.log('┌─ Periodic Status Update ──────────────────┐');
console.log(`│ Timestamp: ${timestamp}`);
console.log(`│ Power Status: ${status.powerStatus}`);
console.log(`│ Battery: ${status.batteryCapacity}% | Runtime: ${status.batteryRuntime} min`);
console.log('└───────────────────────────────────────────┘');
const periodicBoxWidth = 45;
logger.logBoxTitle('Periodic Status Update', periodicBoxWidth);
logger.logBoxLine(`Timestamp: ${timestamp}`);
logger.logBoxLine(`Power Status: ${status.powerStatus}`);
logger.logBoxLine(`Battery: ${status.batteryCapacity}% | Runtime: ${status.batteryRuntime} min`);
logger.logBoxEnd();
lastLogTime = currentTime;
}
@@ -293,7 +298,7 @@ export class NupstDaemon {
* @param reason Reason for shutdown
*/
public async initiateShutdown(reason: string): Promise<void> {
console.log(`Initiating system shutdown due to: ${reason}`);
logger.log(`Initiating system shutdown due to: ${reason}`);
// Set a longer delay for shutdown to allow VMs and services to close
const shutdownDelayMinutes = 5;
@@ -312,7 +317,7 @@ export class NupstDaemon {
try {
if (fs.existsSync(path)) {
shutdownCmd = path;
console.log(`Found shutdown command at: ${shutdownCmd}`);
logger.log(`Found shutdown command at: ${shutdownCmd}`);
break;
}
} catch (e) {
@@ -322,32 +327,32 @@ export class NupstDaemon {
if (shutdownCmd) {
// Execute shutdown command with delay to allow for VM graceful shutdown
console.log(`Executing: ${shutdownCmd} -h +${shutdownDelayMinutes} "UPS battery critical..."`);
logger.log(`Executing: ${shutdownCmd} -h +${shutdownDelayMinutes} "UPS battery critical..."`);
const { stdout } = await execFileAsync(shutdownCmd, [
'-h',
`+${shutdownDelayMinutes}`,
`UPS battery critical, shutting down in ${shutdownDelayMinutes} minutes`
]);
console.log('Shutdown initiated:', stdout);
console.log(`Allowing ${shutdownDelayMinutes} minutes for VMs to shut down safely`);
logger.log(`Shutdown initiated: ${stdout}`);
logger.log(`Allowing ${shutdownDelayMinutes} minutes for VMs to shut down safely`);
} else {
// Try using the PATH to find shutdown
try {
console.log('Shutdown command not found in common paths, trying via PATH...');
logger.log('Shutdown command not found in common paths, trying via PATH...');
const { stdout } = await execAsync(`shutdown -h +${shutdownDelayMinutes} "UPS battery critical, shutting down in ${shutdownDelayMinutes} minutes"`, {
env: process.env // Pass the current environment
});
console.log('Shutdown initiated:', stdout);
logger.log(`Shutdown initiated: ${stdout}`);
} catch (e) {
throw new Error(`Shutdown command not found: ${e.message}`);
}
}
// Monitor UPS during shutdown and force immediate shutdown if battery gets too low
console.log('Monitoring UPS during shutdown process...');
logger.log('Monitoring UPS during shutdown process...');
await this.monitorDuringShutdown();
} catch (error) {
console.error('Failed to initiate shutdown:', error);
logger.error(`Failed to initiate shutdown: ${error}`);
// Try alternative shutdown methods
const alternatives = [
@@ -376,24 +381,24 @@ export class NupstDaemon {
}
if (cmdPath) {
console.log(`Trying alternative shutdown method: ${cmdPath} ${alt.args.join(' ')}`);
logger.log(`Trying alternative shutdown method: ${cmdPath} ${alt.args.join(' ')}`);
await execFileAsync(cmdPath, alt.args);
return; // Exit if successful
} else {
// Try using PATH environment
console.log(`Trying alternative via PATH: ${alt.cmd} ${alt.args.join(' ')}`);
logger.log(`Trying alternative via PATH: ${alt.cmd} ${alt.args.join(' ')}`);
await execAsync(`${alt.cmd} ${alt.args.join(' ')}`, {
env: process.env // Pass the current environment
});
return; // Exit if successful
}
} catch (altError) {
console.error(`Alternative method ${alt.cmd} failed:`, altError);
logger.error(`Alternative method ${alt.cmd} failed: ${altError}`);
// Continue to next method
}
}
console.error('All shutdown methods failed');
logger.error('All shutdown methods failed');
}
}