Как поддерживать разные файлы журналов для разных целей в 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
],
],
],