feat(logging): migrate email pipeline to email channel

This commit is contained in:
F4ilji
2026-07-05 23:28:23 +05:00
parent 41b00fcdae
commit 49dd578e50
8 changed files with 60 additions and 60 deletions
@@ -53,11 +53,11 @@ class FetchEmailNewsAction
{
// Проверяем, включена ли функция
if (!config('email-news.enabled', true)) {
Log::warning('[FetchEmailNewsAction] Функция отключена в конфиге');
Log::channel('email')->warning('Функция отключена в конфиге');
throw EmailFetchException::featureDisabled();
}
Log::info('[FetchEmailNewsAction] Начало получения новостей из Email');
Log::channel('email')->info('Начало получения новостей из Email');
$result = [
'processed_emails' => 0,
@@ -82,7 +82,7 @@ class FetchEmailNewsAction
$hasMoreEmails = true;
while ($hasMoreEmails) {
Log::info('[FetchEmailNewsAction] Обработка batch', [
Log::channel('email')->info('Обработка batch', [
'batch' => $result['batches_processed'] + 1,
'batch_size' => self::BATCH_SIZE,
'memory_usage' => round(memory_get_usage(true) / 1024 / 1024, 2) . 'MB',
@@ -96,7 +96,7 @@ class FetchEmailNewsAction
if (empty($emails)) {
$hasMoreEmails = false;
Log::info('[FetchEmailNewsAction] Нет больше писем для обработки');
Log::channel('email')->info('Нет больше писем для обработки');
break;
}
@@ -127,7 +127,7 @@ class FetchEmailNewsAction
$this->collectGarbageIfNeeded();
}
Log::info('[FetchEmailNewsAction] Завершено', [
Log::channel('email')->info('Завершено', [
'processed' => $result['processed_emails'],
'created_posts' => $result['created_posts'],
'skipped' => $result['skipped_emails'],
@@ -141,7 +141,7 @@ class FetchEmailNewsAction
return $result;
} catch (\Exception $e) {
Log::error('[FetchEmailNewsAction] Критическая ошибка', [
Log::channel('email')->error('Критическая ошибка', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);
@@ -159,7 +159,7 @@ class FetchEmailNewsAction
*/
private function processEmail(array $email, Folder $folder): array
{
Log::info('[FetchEmailNewsAction:processEmail] Обработка письма', [
Log::channel('email')->info('Обработка письма', [
'subject' => $email['subject'] ?? 'unknown',
'from' => $email['from_email'] ?? 'unknown',
'uid' => $email['uid'] ?? 'unknown',
@@ -168,7 +168,7 @@ class FetchEmailNewsAction
try {
// SAFETY: Проверка наличия валидного IMAP message объекта
if (!isset($email['message']) || !is_object($email['message'])) {
Log::warning('[FetchEmailNewsAction:processEmail] Отсутствует IMAP message объект', [
Log::channel('email')->warning('Отсутствует IMAP message объект', [
'subject' => $email['subject'] ?? 'unknown',
]);
@@ -185,7 +185,7 @@ class FetchEmailNewsAction
$hasDocument = collect($attachments)->contains(fn($att) => $att->isDocument());
if (!$hasDocument) {
Log::warning('[FetchEmailNewsAction:processEmail] Нет DOC/DOCX файла во вложениях', [
Log::channel('email')->warning('Нет DOC/DOCX файла во вложениях', [
'subject' => $email['subject'] ?? 'unknown',
]);
@@ -207,7 +207,7 @@ class FetchEmailNewsAction
// Помечаем письмо как прочитанное
$this->markEmail($email['message'], $folder);
Log::info('[FetchEmailNewsAction:processEmail] Письмо успешно обработано', [
Log::channel('email')->info('Письмо успешно обработано', [
'subject' => $email['subject'] ?? 'unknown',
'post_id' => $postResult['post']->id,
]);
@@ -218,7 +218,7 @@ class FetchEmailNewsAction
'attachments_count' => count($attachments),
];
} catch (\Exception $e) {
Log::error('[FetchEmailNewsAction:processEmail] Ошибка обработки письма', [
Log::channel('email')->error('Ошибка обработки письма', [
'subject' => $email['subject'] ?? 'unknown',
'error' => $e->getMessage(),
]);
@@ -244,7 +244,7 @@ class FetchEmailNewsAction
$fullPath = storage_path('app/' . $attachment->path);
if (!file_exists($fullPath)) {
Log::warning('[FetchEmailNewsAction:convertToUploadedFiles] Файл не найден', [
Log::channel('email')->warning('Файл не найден', [
'path' => $attachment->path,
]);
continue;
@@ -262,7 +262,7 @@ class FetchEmailNewsAction
$uploadedFiles[] = $uploadedFile;
}
Log::info('[FetchEmailNewsAction:convertToUploadedFiles] Конвертировано файлов', [
Log::channel('email')->info('Конвертировано файлов', [
'count' => count($uploadedFiles),
]);
@@ -304,7 +304,7 @@ class FetchEmailNewsAction
$memoryAfter = round(memory_get_usage(true) / 1024 / 1024, 2);
$freed = round(($memoryBefore - $memoryAfter), 2);
Log::info('[FetchEmailNewsAction] Сборка мусора', [
Log::channel('email')->info('Сборка мусора', [
'memory_before' => $memoryBefore . 'MB',
'memory_after' => $memoryAfter . 'MB',
'freed' => $freed . 'MB',
@@ -34,7 +34,7 @@ class ProcessMixedFilesAction
// Принудительная очистка памяти перед обработкой
gc_collect_cycles();
Log::info('[ProcessMixedFilesAction] Начало обработки файлов', [
Log::channel('email')->info('Начало обработки файлов', [
'files_count' => $files->count(),
'files' => $files->map(fn($f) => $f->getClientOriginalName())->toArray(),
'memory_usage' => round(memory_get_usage(true) / 1024 / 1024, 2) . ' MB',
@@ -45,11 +45,11 @@ class ProcessMixedFilesAction
$mainFile = $this->findMainNewsFileTask->run($files);
if (!$mainFile) {
Log::error('[ProcessMixedFilesAction] Не найден файл для извлечения текста');
Log::channel('email')->error('Не найден файл для извлечения текста');
throw new \RuntimeException('Не найден DOC/DOCX файл для извлечения текста');
}
Log::info('[ProcessMixedFilesAction] Основной файл найден', [
Log::channel('email')->info('Основной файл найден', [
'file' => $mainFile->getClientOriginalName(),
'extension' => $mainFile->getClientOriginalExtension(),
'real_path' => $mainFile->getRealPath(),
@@ -57,28 +57,28 @@ class ProcessMixedFilesAction
]);
// Извлекаем текст из основного файла (поддерживает и .doc, и .docx)
Log::info('[ProcessMixedFilesAction] Начало извлечения текста из документа');
Log::channel('email')->info('Начало извлечения текста из документа');
try {
$extractedText = $this->extractTextFromDocumentTask->run($mainFile);
Log::info('[ProcessMixedFilesAction] Текст извлечен', [
Log::channel('email')->info('Текст извлечен', [
'text_length' => strlen($extractedText ?? ''),
'text_preview' => substr($extractedText ?? '', 0, 100),
]);
} catch (\Exception $e) {
Log::error('[ProcessMixedFilesAction] Ошибка при извлечении текста', [
Log::channel('email')->error('Ошибка при извлечении текста', [
'error' => $e->getMessage(),
'file' => $mainFile->getClientOriginalName(),
]);
throw $e;
}
Log::info('[ProcessMixedFilesAction] Результат извлечения текста', [
Log::channel('email')->info('Результат извлечения текста', [
'text_length' => strlen($extractedText ?? ''),
'has_text' => !empty($extractedText),
]);
if (empty($extractedText)) {
Log::warning('[ProcessMixedFilesAction] Пустой текст после извлечения', [
Log::channel('email')->warning('Пустой текст после извлечения', [
'file' => $mainFile->getClientOriginalName(),
]);
}
@@ -93,7 +93,7 @@ class ProcessMixedFilesAction
$categories = Category::all();
// Отправляем текст в AI
Log::info('[ProcessMixedFilesAction] Отправка текста в AI сервис', [
Log::channel('email')->info('Отправка текста в AI сервис', [
'text_length' => strlen($extractedText ?? ''),
'categories_count' => $categories->count(),
]);
@@ -101,7 +101,7 @@ class ProcessMixedFilesAction
try {
$newsData = $this->callAiServiceTask->run($extractedText, $categories);
} catch (\Exception $e) {
Log::error('[ProcessMixedFilesAction] Ошибка вызова AI сервиса', [
Log::channel('email')->error('Ошибка вызова AI сервиса', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);
@@ -109,11 +109,11 @@ class ProcessMixedFilesAction
}
if (!$newsData) {
Log::error('[ProcessMixedFilesAction] AI сервис вернул пустой ответ');
Log::channel('email')->error('AI сервис вернул пустой ответ');
throw new \RuntimeException('Не удалось распознать данные через AI сервис. Проверьте логи AI запроса.');
}
Log::info('[ProcessMixedFilesAction] AI данные успешно получены', [
Log::channel('email')->info('AI данные успешно получены', [
'title' => $newsData['title'] ?? 'N/A',
'category_id' => $newsData['category_id'] ?? 'N/A',
]);
@@ -130,7 +130,7 @@ class ProcessMixedFilesAction
*/
private function saveFiles(Collection $files, UploadedFile $mainFile): array
{
Log::info('[ProcessMixedFilesAction:saveFiles] Начало сохранения файлов', [
Log::channel('email')->info('Начало сохранения файлов', [
'total_files' => $files->count(),
]);
@@ -151,7 +151,7 @@ class ProcessMixedFilesAction
// Если это изображение - сжимаем
if ($this->compressImageTask->isImage($file)) {
Log::info('[ProcessMixedFilesAction:saveFiles] Обработка изображения', [
Log::channel('email')->info('Обработка изображения', [
'file' => $file->getClientOriginalName(),
]);
@@ -161,7 +161,7 @@ class ProcessMixedFilesAction
$compressionStats['compressed']++;
$compressionStats['saved_bytes'] += $result['original_size'] - $result['size'];
Log::info('[ProcessMixedFilesAction:saveFiles] Изображение сжато', [
Log::channel('email')->info('Изображение сжато', [
'file' => $file->getClientOriginalName(),
'original_size' => $this->formatFileSize($result['original_size']),
'compressed_size' => $this->formatFileSize($result['size']),
@@ -185,7 +185,7 @@ class ProcessMixedFilesAction
}
}
Log::info('[ProcessMixedFilesAction:saveFiles] Статистика сжатия', [
Log::channel('email')->info('Статистика сжатия', [
'total_images' => $compressionStats['total'],
'compressed' => $compressionStats['compressed'],
'saved' => $this->formatFileSize($compressionStats['saved_bytes']),
@@ -102,7 +102,7 @@ class ProcessUploadedFilesAction
}
}
Log::info('[ProcessUploadedFilesAction] Статистика сжатия', [
Log::channel('email')->info('[ProcessUploadedFilesAction] Статистика сжатия', [
'total_images' => $compressionStats['total'],
'compressed' => $compressionStats['compressed'],
'saved' => $this->formatFileSize($compressionStats['saved_bytes']),