106 lines
2.9 KiB
PHP
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];
|
|
}
|
|
}
|