TestTimeRotatingLog.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Support\Facades\Log;
  5. /**
  6. * 测试时间切割功能的日志驱动
  7. */
  8. class TestTimeRotatingLog extends Command
  9. {
  10. /**
  11. * 命令签名
  12. *
  13. * @var string
  14. */
  15. protected $signature = 'log:test-time-rotating {--wait=65 : 等待时间(秒)}';
  16. /**
  17. * 命令描述
  18. *
  19. * @var string
  20. */
  21. protected $description = '测试日志驱动的时间切割功能(60秒后自动切割)';
  22. /**
  23. * 执行命令
  24. *
  25. * @return int
  26. */
  27. public function handle()
  28. {
  29. $waitTime = (int) $this->option('wait');
  30. $this->info("开始测试时间切割功能...");
  31. $this->info("将等待 {$waitTime} 秒来测试60秒自动切割功能");
  32. // 获取测试日志实例
  33. $testLogger = Log::channel('size_rotating_daily');
  34. // 写入第一条日志
  35. $testLogger->info("第一条测试日志 - " . date('Y-m-d H:i:s'));
  36. $this->info("已写入第一条日志");
  37. // 显示当前日志文件状态
  38. $this->showLogFileStatus();
  39. // 等待指定时间
  40. $this->info("等待 {$waitTime} 秒...");
  41. $progressBar = $this->output->createProgressBar($waitTime);
  42. $progressBar->start();
  43. for ($i = 0; $i < $waitTime; $i++) {
  44. sleep(1);
  45. $progressBar->advance();
  46. }
  47. $progressBar->finish();
  48. $this->newLine();
  49. // 写入第二条日志,这应该触发时间切割
  50. $testLogger->info("第二条测试日志 - " . date('Y-m-d H:i:s') . " (应该触发时间切割)");
  51. $this->info("已写入第二条日志");
  52. // 再次显示日志文件状态
  53. $this->showLogFileStatus();
  54. $this->info("测试完成!");
  55. return 0;
  56. }
  57. /**
  58. * 显示日志文件状态
  59. *
  60. * @return void
  61. */
  62. private function showLogFileStatus(): void
  63. {
  64. $logPath = storage_path('logs');
  65. // 检查主日志文件
  66. $mainLogFile = $logPath . '/laravel.log';
  67. $files = [];
  68. if (file_exists($mainLogFile)) {
  69. $files[] = $mainLogFile;
  70. }
  71. // 检查备份日志文件
  72. $backupPattern = $logPath . '/size_rotating_daily/laravel-' . date('Y-m-d') . '*.log';
  73. $backupFiles = glob($backupPattern);
  74. if ($backupFiles) {
  75. $files = array_merge($files, $backupFiles);
  76. }
  77. if (empty($files)) {
  78. $this->warn("没有找到日志文件");
  79. return;
  80. }
  81. $this->newLine();
  82. $this->info("当前日志文件状态:");
  83. $tableData = [];
  84. foreach ($files as $file) {
  85. $filename = basename($file);
  86. $size = filesize($file);
  87. $sizeFormatted = $this->formatFileSize($size);
  88. $lastModified = date('Y-m-d H:i:s', filemtime($file));
  89. $ageSeconds = time() - filemtime($file);
  90. $tableData[] = [$filename, $sizeFormatted, $lastModified, $ageSeconds . '秒前'];
  91. }
  92. // 按文件名排序
  93. usort($tableData, function ($a, $b) {
  94. return strcmp($a[0], $b[0]);
  95. });
  96. $this->table(['文件名', '大小', '最后修改时间', '文件年龄'], $tableData);
  97. }
  98. /**
  99. * 格式化文件大小
  100. *
  101. * @param int $bytes
  102. * @return string
  103. */
  104. private function formatFileSize(int $bytes): string
  105. {
  106. if ($bytes >= 1024 * 1024 * 1024) {
  107. return round($bytes / (1024 * 1024 * 1024), 2) . ' GB';
  108. } elseif ($bytes >= 1024 * 1024) {
  109. return round($bytes / (1024 * 1024), 2) . ' MB';
  110. } elseif ($bytes >= 1024) {
  111. return round($bytes / 1024, 2) . ' KB';
  112. } else {
  113. return $bytes . ' B';
  114. }
  115. }
  116. }