Файловый PSR лог в Bitrix вне класса

Пример использования

define("STOP_STATISTICS", true);
define('NO_AGENT_CHECK', true);
define('NOT_CHECK_PERMISSIONS', true);
define("DisableEventsCheck", true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

CustomPayLogger::getInstance()->logRequest();

Если не нужен класс расширение, то можно обращаться по названию лога и перейти сразу к пункту 3

define("STOP_STATISTICS", true);
define('NO_AGENT_CHECK', true);
define('NOT_CHECK_PERMISSIONS', true);
define("DisableEventsCheck", true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

$log = \Bitrix\Main\Diag\Logger::create('CustomPayLogger', [null]);
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
$debugInfo = http_build_query($request->toArray());

$log?->debug(
    "[sale_ps_result.php - request] | {date} | {debugInfo} | {php_input}\n",
    [
        'debugInfo' => $debugInfo,
        'php_input' => empty($debugInfo) ? file_get_contents('php://input') : '',
    ]
);

1. Создаем trait с синглтоном, для удобства обращения к объекту лога

файл /bitrix/php_interface/AwzBaseInstance.php

<?php
trait AwzBaseInstance {

    use \Psr\Log\LoggerAwareTrait;

    public $requestId;

    private function __construct(){
        $this->requestId = md5(time().\Bitrix\Main\Security\Random::getString(10));
    }

    public static function getInstance(string $siteId='')
    {
        static $_instance;
        if($_instance === null){
            $_instance = new self();
        }
        return $_instance;
    }

    public function getLogger(): ?\Psr\Log\LoggerInterface
    {
        if ($this->logger === null)
        {
            $logger = \Bitrix\Main\Diag\Logger::create(static::class, [$this]);
            if ($logger !== null)
            {
                $this->setLogger($logger);
            }
        }
        return $this->logger;
    }

}

trait awzBaseInstanceFunc {

    public function logRequest(string $name = "request"){

        $request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
        $debugInfo = http_build_query($request->toArray());

        $this->getLogger()?->debug(
            "{requestId} | {name} | {date} | {debugInfo} | {php_input}\n",
            [
                'requestId'=>$this->requestId,
                'name'=>$name,
                'debugInfo' => $debugInfo,
                'php_input' => empty($debugInfo) ? file_get_contents('php://input') : '',
            ]
        );

    }

}

и подключаем trait в init.php

include_once($_SERVER['DOCUMENT_ROOT']."/bitrix/php_interface/AwzBaseInstance.php");

2. Cоздаем класс-логер

Можно разместить в init.php, чтобы был доступен везде

class CustomPayLogger {
    use AwzBaseInstance;
    use awzBaseInstanceFunc;
}

3. Включаем логирование

/bitrix/.settings_extra.php - документация Битрикс

<?php
$finalSett = [];
$finalSett['loggers'] = $finalSett['loggers'] ?? [];
$finalSett['loggers']['readonly'] = $finalSett['loggers']['readonly'] ?? true;
$finalSett['loggers']['value'] = $finalSett['loggers']['value'] ?? [];

$finalSett['loggers']['value']['CustomPayLogger'] = [
    'className' => '\\Bitrix\\Main\\Diag\\FileLogger',
    'constructorParams' => function(){
        return [$_SERVER['DOCUMENT_ROOT'].'/local/logs/awz.log.CustomPayLogger.log'];
    },
    'level' => \Psr\Log\LogLevel::DEBUG
];
return $finalSett;

Обсуждение в Telegram

Для улучшения работы сайта используются cookie.
Подробнее об этом в Политике cookie.
Принять Настроить