#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');