| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- <?php
- namespace App\Console\Commands;
- use Illuminate\Console\Command;
- use Illuminate\Support\Facades\Log;
- /**
- * 测试时间切割功能的日志驱动
- */
- class TestTimeRotatingLog extends Command
- {
- /**
- * 命令签名
- *
- * @var string
- */
- protected $signature = 'log:test-time-rotating {--wait=65 : 等待时间(秒)}';
- /**
- * 命令描述
- *
- * @var string
- */
- protected $description = '测试日志驱动的时间切割功能(60秒后自动切割)';
- /**
- * 执行命令
- *
- * @return int
- */
- public function handle()
- {
- $waitTime = (int) $this->option('wait');
-
- $this->info("开始测试时间切割功能...");
- $this->info("将等待 {$waitTime} 秒来测试60秒自动切割功能");
- // 获取测试日志实例
- $testLogger = Log::channel('size_rotating_daily');
- // 写入第一条日志
- $testLogger->info("第一条测试日志 - " . date('Y-m-d H:i:s'));
- $this->info("已写入第一条日志");
-
- // 显示当前日志文件状态
- $this->showLogFileStatus();
- // 等待指定时间
- $this->info("等待 {$waitTime} 秒...");
- $progressBar = $this->output->createProgressBar($waitTime);
- $progressBar->start();
-
- for ($i = 0; $i < $waitTime; $i++) {
- sleep(1);
- $progressBar->advance();
- }
-
- $progressBar->finish();
- $this->newLine();
- // 写入第二条日志,这应该触发时间切割
- $testLogger->info("第二条测试日志 - " . date('Y-m-d H:i:s') . " (应该触发时间切割)");
- $this->info("已写入第二条日志");
- // 再次显示日志文件状态
- $this->showLogFileStatus();
- $this->info("测试完成!");
- return 0;
- }
- /**
- * 显示日志文件状态
- *
- * @return void
- */
- private function showLogFileStatus(): void
- {
- $logPath = storage_path('logs');
-
- // 检查主日志文件
- $mainLogFile = $logPath . '/laravel.log';
- $files = [];
- if (file_exists($mainLogFile)) {
- $files[] = $mainLogFile;
- }
-
- // 检查备份日志文件
- $backupPattern = $logPath . '/size_rotating_daily/laravel-' . date('Y-m-d') . '*.log';
- $backupFiles = glob($backupPattern);
- if ($backupFiles) {
- $files = array_merge($files, $backupFiles);
- }
- if (empty($files)) {
- $this->warn("没有找到日志文件");
- return;
- }
- $this->newLine();
- $this->info("当前日志文件状态:");
- $tableData = [];
- foreach ($files as $file) {
- $filename = basename($file);
- $size = filesize($file);
- $sizeFormatted = $this->formatFileSize($size);
- $lastModified = date('Y-m-d H:i:s', filemtime($file));
- $ageSeconds = time() - filemtime($file);
- $tableData[] = [$filename, $sizeFormatted, $lastModified, $ageSeconds . '秒前'];
- }
- // 按文件名排序
- usort($tableData, function ($a, $b) {
- return strcmp($a[0], $b[0]);
- });
- $this->table(['文件名', '大小', '最后修改时间', '文件年龄'], $tableData);
- }
- /**
- * 格式化文件大小
- *
- * @param int $bytes
- * @return string
- */
- private function formatFileSize(int $bytes): string
- {
- if ($bytes >= 1024 * 1024 * 1024) {
- return round($bytes / (1024 * 1024 * 1024), 2) . ' GB';
- } elseif ($bytes >= 1024 * 1024) {
- return round($bytes / (1024 * 1024), 2) . ' MB';
- } elseif ($bytes >= 1024) {
- return round($bytes / 1024, 2) . ' KB';
- } else {
- return $bytes . ' B';
- }
- }
- }
|