Просмотр исходного кода

新增数据库版本的日志系统,应对服务器负载均衡问题

lh 5 месяцев назад
Родитель
Сommit
4139af9c15

+ 49 - 24
app/Http/Controllers/Anime/AnimeController.php

@@ -405,10 +405,12 @@ class AnimeController extends BaseController
                                 } catch (\Exception $e) {
                                     DB::rollBack();
                                     
-                                    dLog('anime')->error('视频任务处理失败', [
+                                    $logData = [
                                         'task_id' => $taskId,
                                         'error' => $e->getMessage()
-                                    ]);
+                                    ];
+                                    dLog('anime')->error('视频任务处理失败', $logData);
+                                    logDB('anime', 'error', '视频任务处理失败', $logData);
                                 }
                             } elseif ($statusResult['status'] === 'failed') {
                                 DB::table('mp_episode_segments')
@@ -658,11 +660,13 @@ class AnimeController extends BaseController
                 ];
                 
             } catch (\Exception $e) {
-                dLog('anime')->error('创建分镜视频任务失败: ' . $e->getMessage(), [
+                $logData = [
                     'segment_id' => $segment->segment_id,
                     'anime_id' => $animeId,
                     'episode_number' => $episodeNumber
-                ]);
+                ];
+                dLog('anime')->error('创建分镜视频任务失败: ' . $e->getMessage(), $logData);
+                logDB('anime', 'error', '创建分镜视频任务失败: ' . $e->getMessage(), $logData);
                 continue;
             }
         }
@@ -788,11 +792,13 @@ class AnimeController extends BaseController
                                     } catch (\Exception $e) {
                                         DB::rollBack();
                                         
-                                        dLog('anime')->error('视频任务处理失败', [
+                                        $logData = [
                                             'segment_id' => $segmentId,
                                             'task_id' => $taskId,
                                             'error' => $e->getMessage()
-                                        ]);
+                                        ];
+                                        dLog('anime')->error('视频任务处理失败', $logData);
+                                        logDB('anime', 'error', '视频任务处理失败', $logData);
                                         
                                         // 发送任务处理失败通知
                                         echo "data: " . json_encode([
@@ -1033,11 +1039,13 @@ class AnimeController extends BaseController
             $result = $this->AnimeService->createCompleteVideoTask($data);
             return $this->success($result);
         } catch (\Exception $e) {
-            dLog('anime')->error('创建完整视频合成任务失败', [
+            $logData = [
                 'anime_id' => $data['anime_id'] ?? '',
                 'episode_id' => $data['episode_id'] ?? '',
                 'error' => $e->getMessage()
-            ]);
+            ];
+            dLog('anime')->error('创建完整视频合成任务失败', $logData);
+            logDB('anime', 'error', '创建完整视频合成任务失败', $logData);
             return $this->error('20003:'.$e->getMessage());
         }
     }
@@ -1151,18 +1159,22 @@ class AnimeController extends BaseController
                         file_put_contents($filePath, $imageData);
                         $downloadedFiles[] = $filePath;
                     } else {
-                        dLog('anime')->warning('图片下载失败', [
+                        $logData = [
                             'segment_id' => $segment->segment_id,
                             'img_url' => $imgUrl
-                        ]);
+                        ];
+                        dLog('anime')->warning('图片下载失败', $logData);
+                        logDB('anime', 'warning', '图片下载失败', $logData);
                     }
                     
                 } catch (\Exception $e) {
-                    dLog('anime')->error('下载图片异常', [
+                    $logData = [
                         'segment_id' => $segment->segment_id,
                         'img_url' => $segment->img_url,
                         'error' => $e->getMessage()
-                    ]);
+                    ];
+                    dLog('anime')->error('下载图片异常', $logData);
+                    logDB('anime', 'error', '下载图片异常', $logData);
                     continue;
                 }
             }
@@ -1215,17 +1227,21 @@ class AnimeController extends BaseController
                                     file_put_contents($audioFilePath, $audioData);
                                     $audioFiles[] = $audioFilePath;
                                 } else {
-                                    dLog('anime')->warning('音频下载失败', [
+                                    $logData = [
                                         'segment_id' => $segment->segment_id,
                                         'audio_url' => $segment->audio_url
-                                    ]);
+                                    ];
+                                    dLog('anime')->warning('音频下载失败', $logData);
+                                    logDB('anime', 'warning', '音频下载失败', $logData);
                                 }
                             } catch (\Exception $e) {
-                                dLog('anime')->error('下载音频异常', [
+                                $logData = [
                                     'segment_id' => $segment->segment_id,
                                     'audio_url' => $segment->audio_url,
                                     'error' => $e->getMessage()
-                                ]);
+                                ];
+                                dLog('anime')->error('下载音频异常', $logData);
+                                logDB('anime', 'error', '下载音频异常', $logData);
                             }
                         }
                     }
@@ -1255,18 +1271,22 @@ class AnimeController extends BaseController
                         exec($ffmpegCommand, $ffmpegOutput, $ffmpegReturnCode);
                         
                         if ($ffmpegReturnCode !== 0 || !file_exists($mergedAudioPath)) {
-                            dLog('anime')->error('FFmpeg 合成音频失败', [
+                            $logData = [
                                 'command' => $ffmpegCommand,
                                 'output' => implode("\n", $ffmpegOutput),
                                 'return_code' => $ffmpegReturnCode
-                            ]);
+                            ];
+                            dLog('anime')->error('FFmpeg 合成音频失败', $logData);
+                            logDB('anime', 'error', 'FFmpeg 合成音频失败', $logData);
                             $mergedAudioPath = null;
                         } else {
-                            dLog('anime')->info('音频合成成功', [
+                            $logData = [
                                 'audio_count' => count($audioFiles),
                                 'output_file' => $mergedAudioPath,
                                 'file_size' => filesize($mergedAudioPath)
-                            ]);
+                            ];
+                            dLog('anime')->info('音频合成成功', $logData);
+                            logDB('anime', 'info', '音频合成成功', $logData);
                         }
                         
                         // 清理临时音频文件和 concat 文件
@@ -1281,12 +1301,15 @@ class AnimeController extends BaseController
                     }
                 } else {
                     dLog('anime')->warning('FFmpeg 未安装,跳过音频合成');
+                    logDB('anime', 'warning', 'FFmpeg 未安装,跳过音频合成', []);
                 }
             } catch (\Exception $e) {
-                dLog('anime')->error('音频合成过程异常', [
+                $logData = [
                     'error' => $e->getMessage(),
                     'trace' => $e->getTraceAsString()
-                ]);
+                ];
+                dLog('anime')->error('音频合成过程异常', $logData);
+                logDB('anime', 'error', '音频合成过程异常', $logData);
                 // 音频合成失败不影响图片导出
                 $mergedAudioPath = null;
             }
@@ -1332,11 +1355,13 @@ class AnimeController extends BaseController
             return response()->download($zipFilePath, $zipFileName)->deleteFileAfterSend(true);
             
         } catch (\Exception $e) {
-            dLog('anime')->error('导出分集图片失败', [
+            $logData = [
                 'anime_id' => $animeId,
                 'episode_id' => $episodeId,
                 'error' => $e->getMessage()
-            ]);
+            ];
+            dLog('anime')->error('导出分集图片失败', $logData);
+            logDB('anime', 'error', '导出分集图片失败', $logData);
             
             // 清理可能存在的临时文件
             if (isset($tempDir) && file_exists($tempDir)) {

+ 31 - 0
app/Libs/Helpers.php

@@ -3283,3 +3283,34 @@ function parseScenesFromText(string $scenesText): array
     
     return $scenes;
 }
+
+
+/**
+ * 记录日志到数据库
+ * 
+ * @param string $channel 日志频道/目录名
+ * @param string $level 日志级别 (info, error, warning, debug)
+ * @param string $message 日志信息
+ * @param array $context 日志详细数据
+ * @return void
+ */
+function logDB($channel, $level, $message, $context = []) {
+    try {
+        // 获取调用堆栈信息
+        $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
+        $caller = $trace[1] ?? $trace[0];
+        
+        \App\Models\SystemLog::create([
+            'channel' => $channel,
+            'level' => $level,
+            'message' => $message,
+            'context' => $context,
+            'file' => $caller['file'] ?? '',
+            'line' => $caller['line'] ?? 0,
+            'log_time' => date('Y-m-d H:i:s'),
+        ]);
+    } catch (\Exception $e) {
+        // 记录日志失败时不影响主流程
+        \Log::error('记录日志到数据库失败: ' . $e->getMessage());
+    }
+}

+ 11 - 0
app/Models/Models/SystemLog.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class SystemLog extends Model
+{
+    use HasFactory;
+}

+ 26 - 0
app/Models/SystemLog.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class SystemLog extends Model
+{
+    protected $table = 'system_logs';
+    
+    public $timestamps = false;
+    
+    protected $fillable = [
+        'channel',
+        'level',
+        'message',
+        'context',
+        'file',
+        'line',
+        'log_time',
+    ];
+    
+    protected $casts = [
+        'context' => 'array',
+    ];
+}