mivita/app/Console/Commands/LogCleanup.php
2026-01-23 17:35:23 +01:00

106 lines
2.9 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;
use Carbon\Carbon;
class LogCleanup extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'logs:cleanup {--days=30 : Number of days to keep logs}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Clean up old log files older than specified days';
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$days = $this->option('days');
$logPath = storage_path('logs');
if (!File::isDirectory($logPath)) {
$this->error("Log directory not found: {$logPath}");
return 1;
}
$deletedFiles = 0;
$deletedSize = 0;
$cutoffDate = Carbon::now()->subDays($days);
$this->info("Cleaning up log files older than {$days} days (before {$cutoffDate->toDateString()})...");
$files = File::files($logPath);
foreach ($files as $file) {
$filename = $file->getFilename();
// Skip the current laravel.log file
if ($filename === 'laravel.log') {
continue;
}
$lastModified = Carbon::createFromTimestamp($file->getMTime());
if ($lastModified->lt($cutoffDate)) {
$fileSize = $file->getSize();
try {
File::delete($file->getPathname());
$deletedFiles++;
$deletedSize += $fileSize;
$this->line("Deleted: {$filename} (" . $this->formatBytes($fileSize) . ", modified: {$lastModified->toDateString()})");
} catch (\Exception $e) {
$this->error("Failed to delete {$filename}: " . $e->getMessage());
}
}
}
if ($deletedFiles > 0) {
$this->info("\nCleanup complete!");
$this->info("Deleted {$deletedFiles} file(s), freed " . $this->formatBytes($deletedSize));
Log::channel('cleanup')->info("Log cleanup completed", [
'deleted_files' => $deletedFiles,
'freed_space' => $this->formatBytes($deletedSize),
'days' => $days
]);
} else {
$this->info("No old log files found to delete.");
}
return 0;
}
/**
* Format bytes to human readable format
*
* @param int $bytes
* @return string
*/
private function formatBytes($bytes)
{
$units = ['B', 'KB', 'MB', 'GB'];
$bytes = max($bytes, 0);
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
$pow = min($pow, count($units) - 1);
$bytes /= (1 << (10 * $pow));
return round($bytes, 2) . ' ' . $units[$pow];
}
}