Как поддерживать разные файлы журналов для разных целей в Yii2

Я использую Yii2 для проекта. У меня есть класс для потребления сторонних услуг. Этот класс имеет два метода sendRequest и processResponse. Я хотел бы поддерживать отдельные журналы для полезной нагрузки в sendRequest, прежде чем отправлять его и другой журнал для необработанных данных ответа, полученных в processResponse, перед выполнением какой-либо обработки. Кроме того, я хотел бы, чтобы вращение журнала в обоих журналах, поскольку файлы могут расти бесконечно и оба файла должны быть отделены от приложения по умолчанию.бревно. Есть это возможно? Как я могу реализовать это с помощью API Yii2?

3 ответов


Я в конечном итоге вернулся к использованию Yii2 logger, добавив 2 дополнительных целевых файла в my @app/config/main.РНР. Цели файла имели категории = ['orders'] и ['pushNotifications'] соответственно, так что в моем коде я использую:

Yii::info($message, 'pushNotifications');

или

Yii::info($message, 'orders');

вот моя конфигурация журнала:

'log' => [
    'traceLevel' => YII_DEBUG ? 3 : 0,
    'targets' => [
        [
            'class' => 'yii\log\FileTarget',
            'levels' => ['error', 'warning'],
        ],
        [
            'class' => 'yii\log\FileTarget',
            'levels' => ['info'],
            'categories' => ['orders'],
            'logFile' => '@app/runtime/logs/Orders/requests.log',
            'maxFileSize' => 1024 * 2,
            'maxLogFiles' => 20,
        ],
        [
            'class' => 'yii\log\FileTarget',
            'levels' => ['info'],
            'categories' => ['pushNotifications'],
            'logFile' => '@app/runtime/logs/Orders/notification.log',
            'maxFileSize' => 1024 * 2,
            'maxLogFiles' => 50,
        ],
    ],
],

поскольку я не был уверен, как настроить Yii2 logger, чтобы делать то, что я хотел, и гуглить предмет не очень помог, я решил пойти с сторонним регистратором. Я выбрал монолог. Эта функциональность была необходима только в одном классе, поэтому я создаю статический метод getLogger, который возвращает экземпляр Monolog\Logger.

public static function getLogger($name) {
    $logger = new \Monolog\Logger($name);
    $logger->pushHandler(new \Monolog\Handlers\RotatingFileHandle(Yii::getAlias("@app/runtime/logs/$name.log")), \Monolog\Logger::INFO);
    return $logger;
}

затем в методе sendRequest я использую:

static::getLogger('orders')->info($outgoingXmlPayload.$curlResponseXml);

в методе processResponse я использую:

static::getLogger('pushNotifications')->info($notificationXml);

Я буду рад чтобы услышать (или прочитать) от любого, у кого есть лучшее решение. Спасибо. -- АБ


Звездочка * может также пригодиться, если нам нужно собрать больше подкатегорий в кумулятивный файл:

'log' => [
    'traceLevel' => YII_DEBUG ? 3 : 0,
    'flushInterval' => 100, // may prevent from memory exhaustion
    'targets' => [
        [
            'class' => 'yii\log\FileTarget',
            'categories' => ['eshop1*'],
            'logFile' => '@app/runtime/logs/eshop1.log',
            'logVars' => [], // don't log global vars
        ],
        [
            'class' => 'yii\log\FileTarget',
            'categories' => ['eshop2*'],
            'logFile' => '@app/runtime/logs/eshop2.log',
            'logVars' => ['GET', 'POST'], // log some globals
            'exportInterval' => 100, // may prevent from memory exhaust
        ],
    ],
],