comment(Inspiring::quote()); })->purpose('Display an inspiring quote'); // API 요청 로그 정리 커맨드 Artisan::command('api-log:prune', function () { $deleted = ApiRequestLog::pruneOldLogs(); $this->info("✅ {$deleted}개의 API 요청 로그가 삭제되었습니다."); })->purpose('하루 지난 API 요청 로그 삭제'); // 스케줄러 정의 (Laravel 12 표준 방식) // 매일 새벽 03:00에 API 요청 로그 정리 (하루치만 보관) Schedule::command('api-log:prune') ->dailyAt('03:00') ->appendOutputTo(storage_path('logs/scheduler.log')) ->onSuccess(function () { \Illuminate\Support\Facades\Log::info('✅ api-log:prune 스케줄러 실행 성공', ['time' => now()]); }) ->onFailure(function () { \Illuminate\Support\Facades\Log::error('❌ api-log:prune 스케줄러 실행 실패', ['time' => now()]); }); // 매일 새벽 03:10에 감사 로그 정리 (환경값 기반 보관기간) Schedule::command('audit:prune') ->dailyAt('03:10') ->appendOutputTo(storage_path('logs/scheduler.log')) ->onSuccess(function () { \Illuminate\Support\Facades\Log::info('✅ audit:prune 스케줄러 실행 성공', ['time' => now()]); }) ->onFailure(function () { \Illuminate\Support\Facades\Log::error('❌ audit:prune 스케줄러 실행 실패', ['time' => now()]); }); // 매일 새벽 03:20에 만료된 토큰 정리 (만료 후 24시간 보관) Schedule::command('sanctum:prune-expired --hours=24') ->dailyAt('03:20') ->appendOutputTo(storage_path('logs/scheduler.log')) ->onSuccess(function () { \Illuminate\Support\Facades\Log::info('✅ sanctum:prune-expired 스케줄러 실행 성공', ['time' => now()]); }) ->onFailure(function () { \Illuminate\Support\Facades\Log::error('❌ sanctum:prune-expired 스케줄러 실행 실패', ['time' => now()]); }); // 매일 새벽 03:30에 7일 이상 된 임시 파일 정리 Schedule::command('storage:cleanup-temp') ->dailyAt('03:30') ->appendOutputTo(storage_path('logs/scheduler.log')) ->onSuccess(function () { \Illuminate\Support\Facades\Log::info('✅ storage:cleanup-temp 스케줄러 실행 성공', ['time' => now()]); }) ->onFailure(function () { \Illuminate\Support\Facades\Log::error('❌ storage:cleanup-temp 스케줄러 실행 실패', ['time' => now()]); }); // 매일 새벽 03:40에 휴지통 파일 영구 삭제 (30일 이상) Schedule::command('storage:cleanup-trash') ->dailyAt('03:40') ->appendOutputTo(storage_path('logs/scheduler.log')) ->onSuccess(function () { \Illuminate\Support\Facades\Log::info('✅ storage:cleanup-trash 스케줄러 실행 성공', ['time' => now()]); }) ->onFailure(function () { \Illuminate\Support\Facades\Log::error('❌ storage:cleanup-trash 스케줄러 실행 실패', ['time' => now()]); }); // 매일 새벽 03:50에 만료된 공유 링크 정리 Schedule::command('storage:cleanup-links') ->dailyAt('03:50') ->appendOutputTo(storage_path('logs/scheduler.log')) ->onSuccess(function () { \Illuminate\Support\Facades\Log::info('✅ storage:cleanup-links 스케줄러 실행 성공', ['time' => now()]); }) ->onFailure(function () { \Illuminate\Support\Facades\Log::error('❌ storage:cleanup-links 스케줄러 실행 실패', ['time' => now()]); }); // 매일 새벽 04:00에 용량 사용 히스토리 기록 Schedule::command('storage:record-usage') ->dailyAt('04:00') ->appendOutputTo(storage_path('logs/scheduler.log')) ->onSuccess(function () { \Illuminate\Support\Facades\Log::info('✅ storage:record-usage 스케줄러 실행 성공', ['time' => now()]); }) ->onFailure(function () { \Illuminate\Support\Facades\Log::error('❌ storage:record-usage 스케줄러 실행 실패', ['time' => now()]); });