sanches.free
Логирование агентов Битрикс: BX_AGENTS_LOG_FUNCTION
Задача
Агенты выполняются в фоновых запросах и через административную панель. Когда задача тормозит или падает неочевидно, нужен лёгкий журнал времени между вызовами без переопределения ядра.
После объявления константы до подключения модуля agent (чаще всего в dbconn.php или общем bootstrap-файле) ядро передаёт в колбэк четыре параметра: массив агента, метку операции (start / finish), необязательный результат и флаг возврата после записи строки.
Пример логирования в файл
define('BX_AGENTS_LOG_FUNCTION', 'logAgentExecution');
function logAgentExecution($agent, $operation, $result = false, $return = false)
{
clearstatcache();
$handle = fopen($_SERVER['DOCUMENT_ROOT'] . '/agents_debug.log', 'ab');
if (!$handle) {
return $return;
}
static $timers = [];
$moment = date('Y-m-d H:i:s');
if ($operation === 'start') {
$timers[$agent['ID']] = microtime(true);
fwrite(
$handle,
sprintf(
"%s AGENT #%s START %s [%s], interval=%s\n",
$moment,
$agent['ID'],
$agent['NAME'],
$agent['MODULE_ID'],
$agent['AGENT_INTERVAL']
)
);
} elseif ($operation === 'finish') {
$elapsed = isset($timers[$agent['ID']])
? microtime(true) - $timers[$agent['ID']]
: 0.0;
fwrite(
$handle,
sprintf(
"%s AGENT #%s FINISH %s сек %s [%s], interval=%s\n",
$moment,
$agent['ID'],
number_format($elapsed, 4, '.', ' '),
$agent['NAME'],
$agent['MODULE_ID'],
$agent['AGENT_INTERVAL']
)
);
unset($timers[$agent['ID']]);
}
fclose($handle);
}На что обратить внимание
- Файл лога нужно исключить из публичного доступа через веб или вынести за пределы
DOCUMENT_ROOT. - Высокая частота агентов быстро распухнет журнал — ротируйте или временно включайте лог только на диагностируемых средах.
- Функцию определяйте до выполнения кода модулей, иначе ранний агент может стартовать до объявления обработчика.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии