LogService.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. namespace App\Module\Admin\Services;
  3. use Illuminate\Support\Facades\File;
  4. use Illuminate\Support\Facades\Log;
  5. use Carbon\Carbon;
  6. /**
  7. * 日志管理服务
  8. */
  9. class LogService
  10. {
  11. /**
  12. * 清理旧日志
  13. *
  14. * @param int $days 保留天数
  15. * @return array
  16. */
  17. public function cleanOldLogs(int $days = 30): array
  18. {
  19. $results = [];
  20. $logPath = storage_path('logs');
  21. try {
  22. $cutoffDate = Carbon::now()->subDays($days);
  23. $deletedFiles = 0;
  24. $deletedSize = 0;
  25. $files = File::glob($logPath . '/*.log');
  26. foreach ($files as $file) {
  27. $fileTime = Carbon::createFromTimestamp(File::lastModified($file));
  28. if ($fileTime->lt($cutoffDate)) {
  29. $size = File::size($file);
  30. File::delete($file);
  31. $deletedFiles++;
  32. $deletedSize += $size;
  33. }
  34. }
  35. $results = [
  36. 'status' => 'success',
  37. 'message' => "清理完成,删除了 {$deletedFiles} 个文件",
  38. 'deleted_files' => $deletedFiles,
  39. 'deleted_size' => $this->formatBytes($deletedSize),
  40. ];
  41. Log::info('Admin: 日志清理完成', $results);
  42. } catch (\Exception $e) {
  43. $results = [
  44. 'status' => 'error',
  45. 'message' => $e->getMessage(),
  46. ];
  47. Log::error('Admin: 日志清理失败', ['error' => $e->getMessage()]);
  48. }
  49. return $results;
  50. }
  51. /**
  52. * 获取日志统计信息
  53. *
  54. * @return array
  55. */
  56. public function getLogStatistics(): array
  57. {
  58. $logPath = storage_path('logs');
  59. $files = File::glob($logPath . '/*.log');
  60. $totalSize = 0;
  61. $fileCount = count($files);
  62. $oldestFile = null;
  63. $newestFile = null;
  64. foreach ($files as $file) {
  65. $totalSize += File::size($file);
  66. $fileTime = Carbon::createFromTimestamp(File::lastModified($file));
  67. if (!$oldestFile || $fileTime->lt($oldestFile)) {
  68. $oldestFile = $fileTime;
  69. }
  70. if (!$newestFile || $fileTime->gt($newestFile)) {
  71. $newestFile = $fileTime;
  72. }
  73. }
  74. return [
  75. 'total_files' => $fileCount,
  76. 'total_size' => $this->formatBytes($totalSize),
  77. 'oldest_file' => $oldestFile?->format('Y-m-d H:i:s'),
  78. 'newest_file' => $newestFile?->format('Y-m-d H:i:s'),
  79. ];
  80. }
  81. /**
  82. * 格式化字节数
  83. *
  84. * @param int $bytes
  85. * @return string
  86. */
  87. protected function formatBytes(int $bytes): string
  88. {
  89. $units = ['B', 'KB', 'MB', 'GB', 'TB'];
  90. for ($i = 0; $bytes > 1024 && $i < count($units) - 1; $i++) {
  91. $bytes /= 1024;
  92. }
  93. return round($bytes, 2) . ' ' . $units[$i];
  94. }
  95. }