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

#php #logging #config #yii2

#php #ведение журнала #конфигурация #yii2

Вопрос:

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

Ответ №1:

В конечном итоге я вернулся к использованию Yii2 logger, добавив 2 дополнительных целевых файла в свой @app/config/main.php . Целевые файлы имели categories = [‘orders’] и [‘PushNotifications’] соответственно, так что в моем коде я использую:

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

или

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

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

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

Комментарии:

1. Я опубликовал усовершенствование этой техники здесь, в Zen and the Art of Craft CMS Log File Reading статья

Ответ №2:

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

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

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

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

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

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

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

Ответ №3:

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

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

Ответ №4:

Это работает для меня, для журнала разработчиков

   'components' => [
    'log' => [
      'traceLevel' => YII_DEBUG ? 10 : 0,
      'targets' => [
        [
          'class' => 'yiilogFileTarget',
          'logFile' => '@runtime/logs/dev.log',
          'categories' => ['dev'],
          'levels' => ['trace'],
        ],
      ],
    ],
  

он используется

 Yii::debug('log step 1', 'dev');