method_exists($job, 'getJobId') ? $job->getJobId() : 'unknown', 'data' => $data, 'attempts' => method_exists($job, 'attempts') ? $job->attempts() : 0, 'start_time' => date('Y-m-d H:i:s') ]; Log::channel('queue')->info("{$jobName}任务开始执行", $logData); self::outputToCli("{$jobName}任务开始执行", $logData); } /** * 记录队列任务成功日志 * * @param string $jobName 任务名称 * @param mixed $job 任务对象 * @param array $data 任务数据 * @param mixed $result 执行结果 */ public static function success($jobName, $job, $data, $result = null) { $logData = [ 'job_id' => method_exists($job, 'getJobId') ? $job->getJobId() : 'unknown', 'data' => $data, 'result' => $result, 'end_time' => date('Y-m-d H:i:s') ]; Log::channel('queue')->info("{$jobName}任务执行成功", $logData); self::outputToCli("{$jobName}任务执行成功", $logData); } /** * 记录队列任务警告日志 * * @param string $jobName 任务名称 * @param mixed $job 任务对象 * @param array $data 任务数据 * @param string $message 警告信息 */ public static function warning($jobName, $job, $data, $message) { $logData = [ 'job_id' => method_exists($job, 'getJobId') ? $job->getJobId() : 'unknown', 'data' => $data, 'attempts' => method_exists($job, 'attempts') ? $job->attempts() : 0 ]; Log::channel('queue')->warning("{$jobName}任务警告: {$message}", $logData); self::outputToCli("{$jobName}任务警告: {$message}", $logData, 'warning'); } /** * 记录队列任务异常日志 * * @param string $jobName 任务名称 * @param mixed $job 任务对象 * @param array $data 任务数据 * @param \Exception $e 异常对象 */ public static function error($jobName, $job, $data, \Exception $e) { $logData = [ 'data' => $data, 'error_message' => $e->getMessage(), 'error_file' => $e->getFile(), 'error_line' => $e->getLine(), 'error_trace' => $e->getTraceAsString() ]; // 安全地获取job信息,避免方法不存在导致的错误 if (is_object($job)) { if (method_exists($job, 'getJobId')) { $logData['job_id'] = $job->getJobId(); } if (method_exists($job, 'attempts')) { $logData['attempts'] = $job->attempts(); } } Log::channel('queue')->error("{$jobName}任务执行异常", $logData); self::outputToCli("{$jobName}任务执行异常: " . $e->getMessage(), $logData, 'error'); } /** * 记录队列任务失败日志 * * @param string $jobName 任务名称 * @param array $data 任务数据 * @param string $message 失败信息 */ public static function failed($jobName, $data, $message = '任务进入失败状态,需要手动处理') { $logData = [ 'data' => $data, 'failed_time' => date('Y-m-d H:i:s'), 'message' => $message ]; Log::channel('queue')->error("{$jobName}任务失败", $logData); self::outputToCli("{$jobName}任务失败: {$message}", $logData, 'error'); } /** * 记录队列任务结束日志 * * @param string $jobName 任务名称 * @param mixed $job 任务对象 * @param array $data 任务数据 */ public static function end($jobName, $job, $data) { $logData = [ 'job_id' => method_exists($job, 'getJobId') ? $job->getJobId() : 'unknown', 'data' => $data, 'end_time' => date('Y-m-d H:i:s') ]; Log::channel('queue')->info("{$jobName}任务执行结束", $logData); self::outputToCli("{$jobName}任务执行结束", $logData); } /** * 记录业务执行开始日志 * * @param string $businessName 业务名称 * @param array $data 业务数据 */ public static function businessStart($businessName, $data) { $logData = [ 'data' => $data, 'start_time' => date('Y-m-d H:i:s') ]; Log::channel('queue')->info("开始执行{$businessName}业务", $logData); self::outputToCli("开始执行{$businessName}业务", $logData); } /** * 记录队列任务信息日志 * * @param string $message 日志信息 * @param array $context 上下文数据 */ public static function info($message, array $context = []) { Log::channel('queue')->info($message, $context); self::outputToCli($message, $context); } /** * 输出到CLI命令行 * * @param string $message 消息内容 * @param array $context 上下文数据 * @param string $level 日志级别 */ private static function outputToCli($message, $context = [], $level = 'info') { if (PHP_SAPI === 'cli') { $output = new Output(); $timestamp = date('Y-m-d H:i:s'); switch ($level) { case 'error': $prefix = 'ERROR'; $output->error("[{$timestamp}] [{$prefix}] {$message}"); break; case 'warning': $prefix = 'WARN'; $output->warning("[{$timestamp}] [{$prefix}] {$message}"); break; default: $prefix = 'INFO'; $output->info("[{$timestamp}] [{$prefix}] {$message}"); } } } }