פיתוח מודול לוגינג 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 ימי עסקים. הזמינו מודול לוגינג מפתח—ותשכחו מניתוח לוגים ידני. צרו קשר להערכת פרויקט.

