Files
timebank-cc-public/app/Console/Commands/TrimInactiveProfileLogs.php
Ronald Huynen 2547717edb Initial commit
2026-03-23 21:37:59 +01:00

126 lines
3.8 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Carbon;
class TrimInactiveProfileLogs extends Command
{
protected $signature = 'profiles:trim-logs {--days=30 : Number of days of logs to keep}';
protected $description = 'Trim inactive profile log files to retain only recent entries';
protected $logFiles = [
'inactive-profiles.log',
'mark-inactive-profiles.log',
];
public function handle()
{
$daysToKeep = (int) $this->option('days');
$cutoffDate = Carbon::now()->subDays($daysToKeep);
$this->info("Trimming log files older than {$daysToKeep} days ({$cutoffDate->format('Y-m-d H:i:s')})...");
$totalSizeBefore = 0;
$totalSizeAfter = 0;
$filesProcessed = 0;
foreach ($this->logFiles as $logFileName) {
$logPath = storage_path('logs/' . $logFileName);
if (!File::exists($logPath)) {
$this->warn("Log file not found: {$logFileName}");
continue;
}
$sizeBefore = File::size($logPath);
$totalSizeBefore += $sizeBefore;
$trimmed = $this->trimLogFile($logPath, $cutoffDate);
$sizeAfter = File::size($logPath);
$totalSizeAfter += $sizeAfter;
$filesProcessed++;
if ($trimmed) {
$savedBytes = $sizeBefore - $sizeAfter;
$savedKB = round($savedBytes / 1024, 2);
$this->info("{$logFileName}: Trimmed from " . $this->formatFileSize($sizeBefore) . " to " . $this->formatFileSize($sizeAfter) . " (saved {$savedKB} KB)");
} else {
$this->info("{$logFileName}: No entries older than {$daysToKeep} days (size: " . $this->formatFileSize($sizeBefore) . ")");
}
}
if ($filesProcessed > 0) {
$totalSaved = $totalSizeBefore - $totalSizeAfter;
$this->info("\nTotal: Processed {$filesProcessed} files, saved " . $this->formatFileSize($totalSaved));
}
return 0;
}
/**
* Trim log file to keep only entries newer than cutoff date.
*
* @param string $logPath
* @param Carbon $cutoffDate
* @return bool Whether any entries were removed
*/
protected function trimLogFile($logPath, $cutoffDate)
{
$content = File::get($logPath);
$lines = explode("\n", $content);
$keptLines = [];
$removedCount = 0;
foreach ($lines as $line) {
// Skip empty lines
if (trim($line) === '') {
continue;
}
// Extract timestamp from log line format: [YYYY-MM-DD HH:MM:SS] message
if (preg_match('/^\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\]/', $line, $matches)) {
$logDate = Carbon::parse($matches[1]);
if ($logDate->greaterThanOrEqualTo($cutoffDate)) {
$keptLines[] = $line;
} else {
$removedCount++;
}
} else {
// Keep lines without timestamps (shouldn't happen, but be safe)
$keptLines[] = $line;
}
}
if ($removedCount > 0) {
// Rewrite the log file with only kept lines
File::put($logPath, implode("\n", $keptLines) . "\n");
return true;
}
return false;
}
/**
* Format file size in human-readable format.
*
* @param int $bytes
* @return string
*/
protected function formatFileSize($bytes)
{
if ($bytes >= 1048576) {
return round($bytes / 1048576, 2) . ' MB';
} elseif ($bytes >= 1024) {
return round($bytes / 1024, 2) . ' KB';
} else {
return $bytes . ' bytes';
}
}
}