LogService.php 3.0 KB

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