registerCollectors(); } /** * 注册所有收集器 * * @return void */ private function registerCollectors(): void { $this->collectors = [ 'fund' => new FundLogCollector(), 'item' => new ItemLogCollector(), 'farm' => new FarmLogCollector(), // 可以在这里添加更多收集器 ]; } /** * 执行所有收集器的日志收集 * * @return array 收集结果统计 */ public function collectAll(): array { $results = []; $totalProcessed = 0; $startTime = microtime(true); Log::info("开始执行用户日志收集", [ 'collectors_count' => count($this->collectors) ]); foreach ($this->collectors as $name => $collector) { try { $collectorStartTime = microtime(true); $processedCount = $collector->collect(); $collectorEndTime = microtime(true); $results[$name] = [ 'processed_count' => $processedCount, 'execution_time' => round(($collectorEndTime - $collectorStartTime) * 1000, 2), // 毫秒 'status' => 'success' ]; $totalProcessed += $processedCount; Log::info("收集器执行完成", [ 'collector' => $name, 'processed_count' => $processedCount, 'execution_time_ms' => $results[$name]['execution_time'] ]); } catch (\Exception $e) { $results[$name] = [ 'processed_count' => 0, 'execution_time' => 0, 'status' => 'error', 'error' => $e->getMessage() ]; Log::error("收集器执行失败", [ 'collector' => $name, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); } } $endTime = microtime(true); $totalExecutionTime = round(($endTime - $startTime) * 1000, 2); $summary = [ 'total_processed' => $totalProcessed, 'total_execution_time' => $totalExecutionTime, 'collectors' => $results, 'timestamp' => now()->toDateTimeString() ]; Log::info("用户日志收集完成", $summary); return $summary; } /** * 执行指定收集器的日志收集 * * @param string $collectorName 收集器名称 * @return array 收集结果 */ public function collectByName(string $collectorName): array { if (!isset($this->collectors[$collectorName])) { throw new \InvalidArgumentException("收集器 {$collectorName} 不存在"); } $collector = $this->collectors[$collectorName]; $startTime = microtime(true); try { $processedCount = $collector->collect(); $endTime = microtime(true); return [ 'collector' => $collectorName, 'processed_count' => $processedCount, 'execution_time' => round(($endTime - $startTime) * 1000, 2), 'status' => 'success', 'timestamp' => now()->toDateTimeString() ]; } catch (\Exception $e) { $endTime = microtime(true); return [ 'collector' => $collectorName, 'processed_count' => 0, 'execution_time' => round(($endTime - $startTime) * 1000, 2), 'status' => 'error', 'error' => $e->getMessage(), 'timestamp' => now()->toDateTimeString() ]; } } /** * 获取所有收集器的信息 * * @return array */ public function getCollectorsInfo(): array { $info = []; foreach ($this->collectors as $name => $collector) { $info[$name] = [ 'name' => $name, 'class' => get_class($collector), 'source_table' => $collector->getSourceTable(), 'source_type' => $collector->getSourceType(), ]; } return $info; } /** * 重置指定收集器的处理进度 * * @param string $collectorName 收集器名称 * @return void */ public function resetCollector(string $collectorName): void { if (!isset($this->collectors[$collectorName])) { throw new \InvalidArgumentException("收集器 {$collectorName} 不存在"); } $this->collectors[$collectorName]->resetAllProgress(); Log::info("重置收集器进度", [ 'collector' => $collectorName ]); } /** * 重置所有收集器的处理进度 * * @return void */ public function resetAllCollectors(): void { foreach ($this->collectors as $name => $collector) { $collector->resetAllProgress(); } Log::info("重置所有收集器进度"); } /** * 添加自定义收集器 * * @param string $name 收集器名称 * @param BaseLogCollector $collector 收集器实例 * @return void */ public function addCollector(string $name, BaseLogCollector $collector): void { $this->collectors[$name] = $collector; Log::info("添加自定义收集器", [ 'name' => $name, 'class' => get_class($collector) ]); } /** * 移除收集器 * * @param string $name 收集器名称 * @return void */ public function removeCollector(string $name): void { if (isset($this->collectors[$name])) { unset($this->collectors[$name]); Log::info("移除收集器", [ 'name' => $name ]); } } /** * 获取收集器实例 * * @param string $name 收集器名称 * @return BaseLogCollector|null */ public function getCollector(string $name): ?BaseLogCollector { return $this->collectors[$name] ?? null; } /** * 检查收集器是否存在 * * @param string $name 收集器名称 * @return bool */ public function hasCollector(string $name): bool { return isset($this->collectors[$name]); } }