פיתוח מודול לוגינג PSR-3 עבור 1C-Bitrix

ניפוי באגים בתקרית ייצור ללא לוגים מתאימים הוא כואב: הכלים הסטנדרטיים של Bitrix כותבים לקובץ שטוח ללא מבנה או רוטציה. אנחנו בונים מודול לוגינג תואם PSR-3 שפותר זאת באופן שיטתי. הצוות שלנו מספק פתרון סוהר—מביקורת ועד הטמעה ותמיכה שוטפת—ובכך מבטיח פתרון אמין וסקלבילי.
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
פיתוח מודול לוגינג PSR-3 עבור 1C-Bitrix
בינוני
~1-2 שבועות

הכישורים שלנו:

שאלות נפוצות

פיתוח מודול לוגינג PSR-3 עבור 1C-Bitrix

חקירת תקרית ייצור ללא לוגים מתאימים היא כואבת. המודול הסטנדרטי \Bitrix\Main\Diag\Debug::writeToFile() כותב לקובץ שטוח ללא מבנה, ללא רמות וללא רוטציה. לאחר שבוע של פעילות, הקובץ מגיע ל-2 GB, מה שהופך את הניתוח לבלתי אפשרי ומציאת הרשומה הנכונה לסיוט. אנו מציעים מודול לוגינג שפותר בעיה זו באופן שיטתי. הוא כותב רשומות מובנות למסד הנתונים, משתמש ברמות חומרה, תגיות, קונטקסט, רוטציה וחיפוש דרך ממשק הניהול. זה מקצר את זמן חיפוש השגיאות משעות לדקות. קבלו ייעוץ על הטמעת מודול הלוגינג בפרויקט שלכם.

למה הלוגר הסטנדרטי של Bitrix אינו מתאים

Debug::writeToFile() מערבב את כל האירועים—debug, informational ו-critical—לקובץ אחד. אין רוטציה—הקובץ גדל לעשרות ג'יגה-בייט. אין חיפוש—צריך להשתמש ב-grep על קובץ ענק. אין רמות—אי אפשר לסנן רק שגיאות. זה הופך את ניפוי השגיאות לניחוש. המודול שלנו פותר את החסרונות הללו ישירות מהקופסה: רשומות מובנות ב-ORM, רמות PSR-3, הפרדת ערוצים, רוטציה וחיפוש.

איך מודול הלוגינג מאיץ את ניפוי השגיאות

המודול מיישם את PSR-3, התקן התעשייתי ללוגינג. אתם מקבלים ממשק אחיד לכל רכיבי המערכת. זמן מציאת שגיאה ספציפית מצטמצם פי עשרה בהשוואה לקובץ שטוח. התראות ב-Telegram/Slack על שגיאות קריטיות מאפשרות תגובה מיידית.

ארכיטקטורה

המודול vendor.logger מיישם את ממשק PSR-3 (Psr\Log\LoggerInterface), מה שמאפשר לחבר אותו לכל ספריות שתומכות ב-PSR-3: Guzzle, Doctrine, Symfony.

טבלאות ORM:

  • b_vendor_log_entry — רשומות לוג: id, level (debug/info/notice/warning/error/critical/alert/emergency), channel, message, context (JSON), extra (JSON), created_at, user_id, request_uri, ip
  • b_vendor_log_channel — ערוצים: id, code, name, min_level, handlers (JSON), is_active
  • b_vendor_log_archive — רשומות מאורכבות (לאחר רוטציה): מבנה דומה + archived_at

יישום PSR-3

class BitrixLogger extends \Psr\Log\AbstractLogger
{
    private string $channel;

    public function __construct(string $channel = 'app')
    {
        $this->channel = $channel;
    }

    public function log($level, $message, array $context = []): void
    {
        if (!$this->isLevelEnabled($level)) {
            return;
        }

        $extra = [
            'user_id' => $GLOBALS['USER']?->GetID(),
            'request_uri' => $_SERVER['REQUEST_URI'] ?? '',
            'ip' => $_SERVER['REMOTE_ADDR'] ?? '',
        ];

        LogEntryTable::add([
            'LEVEL' => $level,
            'CHANNEL' => $this->channel,
            'MESSAGE' => $this->interpolate($message, $context),
            'CONTEXT' => $context,
            'EXTRA' => $extra,
        ]);
    }

    private function interpolate(string $message, array $context): string
    {
        $replace = [];
        foreach ($context as $key => $val) {
            $replace['{' . $key . '}'] = is_scalar($val) ? $val : json_encode($val, JSON_UNESCAPED_UNICODE);
        }
        return strtr($message, $replace);
    }
}

שימוש בקוד

$logger = new \Vendor\Logger\BitrixLogger('payment');
$logger->info('Инициирован платёж', ['order_id' => 42, 'sum' => 1500.00, 'gateway' => 'sberbank']);
$logger->error('Ошибка платёжного шлюза', ['order_id' => 42, 'response' => $gatewayResponse]);
// Глобальный логгер через фасад \Vendor\Logger\Log::channel('sync')->warning('Синхронизация с 1С: товар не найден', ['xml_id' => 'ABC-123']);

Handlers

כתיבה למסד הנתונים אינה ה-handler היחיד. המודול תומך במספר handlers לכל ערוץ:

  • DatabaseHandler — כותב ל-class BitrixLogger extends \Psr\Log\AbstractLogger { private string $channel; public function __construct(string $channel = 'app') { $this->channel = $channel; } public function log($level, $message, array $context = []): void { if (!$this->isLevelEnabled($level)) { return; } $extra = [ 'user_id' => $GLOBALS['USER']?->GetID(), 'request_uri' => $_SERVER['REQUEST_URI'] ?? '', 'ip' => $_SERVER['REMOTE_ADDR'] ?? '', ]; LogEntryTable::add([ 'LEVEL' => $level, 'CHANNEL' => $this->channel, 'MESSAGE' => $this->interpolate($message, $context), 'CONTEXT' => $context, 'EXTRA' => $extra, ]); } private function interpolate(string $message, array $context): string { $replace = []; foreach ($context as $key => $val) { $replace['{' . $key . '}'] = is_scalar($val) ? $val : json_encode($val, JSON_UNESCAPED_UNICODE); } return strtr($message, $replace); } } (ראשי)
  • FileHandler — כותב לקובץ עם רוטציה אוטומטית (יומי, מקסימום N קבצים)
  • SlackHandler — שולח critical/emergency לערוץ Slack דרך Webhook
  • TelegramHandler — שולח התראות לבוט Telegram עבור רמה >= error

תצורת הערוץ נשמרת ב-$logger = new \Vendor\Logger\BitrixLogger('payment'); $logger->info('Инициирован платёж', ['order_id' => 42, 'sum' => 1500.00, 'gateway' => 'sberbank']); $logger->error('Ошибка платёжного шлюза', ['order_id' => 42, 'response' => $gatewayResponse]); // Глобальный логгер через фасад \Vendor\Logger\Log::channel('sync')->warning('Синхронизация с 1С: товар не найден', ['xml_id' => 'ABC-123']); בשדה b_vendor_log_entry (JSON). דוגמה:

{
  "handlers": [
    {
      "type": "database",
      "min_level": "debug"
    },
    {
      "type": "telegram",
      "min_level": "error",
      "chat_id": "-100123456789"
    }
  ]
}
Handler מטרה רמה מינימלית
DatabaseHandler אחסון לטווח ארוך debug
FileHandler גישה מהירה ללוגים אחרונים debug
SlackHandler התראות על שגיאות קריטיות critical
TelegramHandler התראות מיידיות error

רוטציה וארכוב

סוכן הרוטציה רץ פעם ביום:

// Записям старше 30 дней — перенос в b_vendor_log_archive
// Записям старше 90 дней в архиве — удаление
// Параметры настраиваются в административном интерфейсе модуля
\Vendor\Logger\RotationAgent::run();

ההעברה מתבצעת בקבוצות של 1000 רשומות כדי למנוע נעילות ארוכות על הטבלה.

יירוט שגיאות PHP

המודול יכול לרשום handler גלובלי לשגיאות PHP:

set_error_handler(function($errno, $errstr, $errfile, $errline) {
    $level = ErrorLevelMapper::toLogLevel($errno);
    \Vendor\Logger\Log::channel('php')->log($level, $errstr, [
        'file' => $errfile,
        'line' => $errline,
        'errno' => $errno,
    ]);
    return false; // Стандартный обработчик Битрикс тоже срабатывает
});

set_exception_handler(function(\Throwable $e) {
    \Vendor\Logger\Log::channel('php')->critical($e->getMessage(), [
        'exception' => get_class($e),
        'file' => $e->getFile(),
        'line' => $e->getLine(),
        'trace' => $e->getTraceAsString(),
    ]);
});

ממשק ניהול

חיפוש לוגים הוא כלי הניפוי העיקרי:

  • סינון לפי רמה, ערוץ, תאריך, IP, משתמש, טקסט הודעה
  • חיפוש קונטקסט (שדה JSON דרך PostgreSQL b_vendor_log_channel או LIKE על נתונים מסודרים)
  • תצוגת רשומה מפורטת: קונטקסט מלא, stack trace, כותרות בקשה
  • סטטיסטיקות: השגיאות המובילות לתקופה, דינמיקה לפי רמה, פילוח לפי ערוץ
  • ניהול תצורת ערוצים ו-handlers

מה כלול בפיתוח המודול?

  • עיצוב מבני טבלאות ORM למשימות שלכם
  • יישום לוגר תואם PSR-3
  • הגדרת handlers (DB, קובץ, Slack, Telegram)
  • פיתוח סוכני רוטציה וארכוב
  • שילוב יירוט שגיאות PHP גלובלי
  • יצירת ממשק ניהול עם חיפוש וסטטיסטיקות
  • שילוב עם קוד קיים (החלפת קריאות handlers)
  • תיעוד תפעול והוראות למפתחים
  • בדיקות בסביבת staging לפני פריסה לייצור

אנו מבטיחים שהמודול עובד על בסיס קוד יציב ללא הפתעות. עם ניסיון של למעלה מ-10 שנים בפיתוח Bitrix ו-40+ מודולי לוגינג שנמסרו בהצלחה, אנו בונים פתרונות שפועלים בצורה צפויה. בפרויקט אחרון עבור קמעונאי מקוון, החלפת הלוגינג בקובץ שטוח במודול שלנו קיצרה את זמן החקירה הממוצע של שגיאות קריטיות משעתיים לפחות מ-15 דקות. למדו עוד על PSR-3.

טעויות נפוצות ביישום
  • שכחת להגדיר רוטציה—טבלאות הארכוב יכולות לגדול ללא שליטה.
  • הגדרת רמה מינימלית גבוהה מדי לערוצים (למשל, רק error)—אובדן מידע ניפוי.
  • אי שילוב התראות Telegram/Slack—גילוי שגיאות רק מלקוחות.
  • שימוש בערוץ יחיד לכל האירועים—אובדן קונטקסט.

לוח זמנים לפיתוח

שלב משך
טבלאות ORM, יישום PSR-3 יום אחד
DatabaseHandler, FileHandler יום אחד
התראות Slack ו-Telegram יום אחד
רוטציה וארכוב (סוכן) יום אחד
יירוט שגיאות PHP יום אחד
ממשק ניהול, חיפוש יומיים
בדיקות יום אחד

סה"כ: מ-8 ימי עסקים. הזמינו מודול לוגינג מפתח—ותשכחו מניתוח לוגים ידני. צרו קשר להערכת פרויקט.