Laravel (5,7) Лесозаготовка
ошибки
Проект в процессе реализации несет несколько ошибок. Обработка ошибок и исключений уже настроена для вас при запуске нового проекта Laravel. Обычно в локальной среде мы должны видеть ошибки для целей отладки. Нам нужно скрывать эти ошибки от пользователей в производственной среде. Это может быть достигнуто с помощью переменной APP_DEBUG, установленной в файле среды .env, хранящемся в корне приложения.
Для локальной среды значение APP_DEBUG должно быть истинным, но для производства его нужно установить в ложное, чтобы скрыть ошибки.
Примечание. После изменения переменной APP_DEBUG необходимо перезапустить сервер Laravel.
логирование
Ведение журнала является важным механизмом, с помощью которого система может регистрировать сгенерированные ошибки. Это полезно для повышения надежности системы. Laravel поддерживает различные режимы журналирования, такие как режимы одиночного, ежедневного, системного журнала и журнала ошибок. Вы можете установить эти режимы в файле config / app.php .
'log' => 'daily'
Вы можете увидеть сгенерированные записи журнала в файле storage / logs / laravel.log .
Laravel придерживается этой философии об использовании популярных библиотек с открытым исходным кодом для выполнения различных общих функций, требуемых в типичной веб-среде: ведение журнала является общей функцией. Следовательно, по умолчанию, Laravel использует Monolog, очень популярную библиотеку журналирования PHP, для всех своих нужд журналирования. В Monolog замечательно то, что он предоставляет общий интерфейс для записи журналов во что угодно, от стандартных текстовых файлов до сторонних служб управления журналами.
Монолог очень гибкий. Он может отправлять ваши журналы в файлы, сокеты, электронную почту, базы данных и различные веб-сервисы. В следующем разделе я покажу вам, как Monolog предоставляет обработчики, которые легко помогут вам отправлять журналы в эти различные пункты назначения. Laravel обычно устанавливает Monolog через файл конфигурации регистрации. Теперь я собираюсь показать вам, как работает файл конфигурации регистрации.
Изучение файла конфигурации журнала
В Laravel есть различные файлы конфигурации, найденные в папке config . В этой папке хранятся файлы конфигурации, предназначенные для соединений с базой данных, соединений с электронной почтой, кэширования и т. Д. Вы также должны ожидать, что ваша конфигурация логирования также будет найдена здесь, и ее путь будет в config / logging.php .
импорт
Когда вы создаете приложение Laravel, первые несколько строк - это импорт, который он использует. По умолчанию вы должны увидеть импортированные два обработчика, показанные выше. Как объяснялось в предыдущем разделе, это два типичных обработчика, которые предоставляет Monolog.
каналы
Laravel Monolog использует концепцию, называемую каналами. Каналы - это разные места, куда вы можете отправлять свои логи. Для остальной части config / logging.php, файл конфигурации возвращает ассоциативный массив с двумя основными ключами - по умолчанию и каналы .
По умолчанию представляет канал по умолчанию, на который отправляется любая регистрация. Очень важно, чтобы канал, выбранный вами по умолчанию, был представлен в массиве под ключевыми каналами. Как вы можете видеть выше, стек является каналом по умолчанию.
Каналы представляют полный список каналов, доступных для отправки ваших журналов, и стек является первым перечисленным каналом. В остальной части этой статьи, когда я упоминаю список каналов, я имею в виду именно этот список.
Конфигурация в каждом канале
В каждом канале, указанном в списке каналов , вы можете видеть различные используемые ключи. Знание того, как каждый ключ влияет на ведение журнала, даст вам максимальную гибкость при настройке выходных данных ведения журнала.
Первый тип, который я хочу охватить, это драйверы . До Laravel 5.6 у Laravel были только драйверы, поддерживающие четыре выходных файла:
- Запись в один файл. По умолчанию это обычно хранилище / logs / laravel.log .
- Ежедневные файлы. По умолчанию это даст вам такие файлы, как
хранилище / журналы / laravel-2018-12-03.log ,
хранилище / logs / laravel-2018-12-04.log и так далее. - Журнал ошибок. Расположение журнала ошибок зависит от программного обеспечения веб-сервера, которое вы используете, такого как nginx или Apache, и ОС сервера. Обычно это означает, что в Linux с Nginx файл находится по адресу /var/log/nginx/error.log .
- Системный журнал, также известный как системный журнал, и еще раз, местоположение зависит от ОС сервера.
Драйверы
С Laravel 5.6 и выше у нас есть совершенно новые драйверы, поддерживающие более широкий диапазон результатов регистрации. Старые драйверы по-прежнему доступны под значениями «single», «daily», «errorlog» и «syslog». Теперь у нас есть новые значения для новых видов выходных данных. Некоторые часто используемые новые драйверы включают в себя:
стек
Это просто означает, что вы можете объединить несколько каналов регистрации. Когда вы используете драйвер «стека», вам необходимо установить массив значений для других каналов под ключом «каналы». См. Рис. 4 для примера используемого драйвера стека.
Монолог
Немного странно видеть, как Монолог снова появляется, на этот раз как его собственный водитель. Следует помнить, что когда вы хотите использовать встроенные обработчики Monolog, вы хотите использовать драйвер Monolog. К счастью, файл конфигурации регистрации по умолчанию содержит два примера использования двух разных обработчиков Monolog. Вместо того, чтобы вдаваться в подробности о различных типах обработчиков Monolog, я оставлю вам ссылку на полный список обработчиков Monolog, чтобы вы могли просматривать их с собственной скоростью.
изготовленный на заказ
В официальной документации Laravel есть только небольшая статья об этом. Между популярными устаревшими драйверами и различными обработчиками Monolog довольно сложно представить, чтобы кто-то написал свой собственный драйвер канала.
Тем не менее, если это то, что вы хотите сделать, вы можете. Обычно пользовательский канал предназначен для записи логов в сторонние сервисы, такие как Apache Kafka и Logstash.
Во-первых, ваш пользовательский канал должен выбрать собственный драйвер, а затем добавить опцию via, чтобы указать класс фабрики логгеров.
'channels' => [
'custom' => [
'driver' => 'custom',
'via' => AppLoggingCustomLoggerFactory::class,
],
],
После настройки пользовательского канала вы готовы определить класс фабрики. Помните, что вы должны вернуть экземпляр Monolog Logger с помощью метода __invoke .
<?php
namespace AppLogging;
use MonologLogger;
class CustomLoggerFactory
{
/**
* This class will create a custom Monolog instance.
*
* @param array $config
* @return MonologLogger
*/
public function __invoke(array $config)
{
return new Logger(...);
}
}
Попробуйте использовать пользовательский драйвер в качестве последнего средства. Если вы немного поищете, обычно вы найдете стандартный способ использования существующих драйверов или обработчиков для ваших особых потребностей ведения журнала. Даже если вам нужно написать собственный драйвер логгера, попробуйте посмотреть, написал ли кто-нибудь версию с открытым исходным кодом или пример необходимого вам класса фабрики логгеров. Другими словами: не изобретайте велосипед, если можете помочь.
Обработчики
Следующая важная вещь, которую вы должны изучить после каналов и драйверов, - это концепция обработчиков. Существует полный список обработчиков для Monolog для отправки логов. Вы даже можете использовать специальные обработчики, чтобы создавать более продвинутые стратегии ведения журналов. Чтобы сэкономить место, я предоставлю вам возможность самостоятельно прочитать полный список обработчиков и просто сгруппировать широкий диапазон обработчиков Monolog по следующим типам:
- Вход в файлы и системный журнал
- Отправка оповещений (таких как Slack) и электронных писем
- Вход на определенные серверы и ведение журнала в сети
- Ведение журнала во время разработки (включая отправку логов в расширение ChromePHP)
- Отправка журналов в базы данных
- Специальные обработчики
Также обратите внимание, что есть специальная опция handler_with, которая позволяет вам присваивать значения методу конструктора отдельного обработчика.
public function __construct(string $ident, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, int $logopts = LOG_PID)
При индивидуальной конфигурации канала вы можете назначить значения для параметров конструктора таким образом.
'syslog_channel_name' => [
'driver' => 'monolog',
'handler' => MonologHandlerSyslogHandler::class,
'handler_with' => [
'ident' => 'some value you want to assign to the ident parameter',
],
],
Написание журнала сообщений и уровней
Если вы сделали это далеко, поздравляю! Теперь вы углубились в детали файла конфигурации для регистрации в Laravel. Большинство разработчиков имеют только поверхностное понимание этого и не позволяют этому помешать им писать сообщения в журнале. Таким образом, теперь вы в большей степени, чем большинство разработчиков, можете настроить протоколирование Laravel для своей команды.
Одним из ключевых деталей конфигурации я не охватывали в предыдущих уровнях раздела. Это отчасти потому, что предыдущий раздел был уже достаточно длинным, но в основном потому, что здесь имеет смысл охватить уровни.
Уровни регистрации
В конкретном файле, в который вы хотите записывать сообщения журнала, убедитесь, что вы импортировали фасад журнала перед записью сообщения журнала, например так:
use IlluminateSupportFacadesLog;
//.. and then somewhere in your php file
Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);
Обычно разработчики хотят иметь разные уровни серьезности, когда дело доходит до регистрации сообщений. Указанные здесь разные уровни регистрации соответствуют спецификации RFC-5424. Так что уровни и их названия не определяются волей-неволей. Эти уровни имеют порядок приоритетов, при этом самый высокий уровень - аварийный, а самый низкий - отладочный. В списке каналов вы можете указать минимальный уровень, на котором отдельный канал будет регистрировать любые сообщения. Например, в случае с фиг. 5 это означает, что канал Slack будет записывать любые сообщения журнала с уровнем критического уровня и выше при запуске.
Журнал фасада отправляет на канал по умолчанию
Уровень - не единственный фактор, который определяет, будет ли Laravel в конечном итоге писать конкретное сообщение на канал. Канал как пункт назначения также является еще одним фактором. Помните, что когда вы используете фасад журнала для написания сообщений журнала, Laravel отправит их на канал по умолчанию, указанный в вашем config / logging.php .
Если вы оставите файл конфигурации ведения журнала без изменений и при условии, что вы не установили переменную среды LOG_CHANNEL в другое значение, вашим каналом по умолчанию будет стек «многоканальный», который, в свою очередь, состоит только из «ежедневного» канала как видно на рисунках 3 и 4.
Отправка сообщений журнала в альтернативные каналы на лету
Тогда возникает вопрос: что если вы хотите отправить определенное сообщение на канал, отличный от канала по умолчанию? Вы можете сознательно выбрать альтернативный канал на лету таким образом:
Log::channel('suspicious')->warning($suspiciousActivity);
Не забудьте убедиться, что выбранный вами альтернативный канал существует в списке каналов в файле конфигурации ведения журнала. В противном случае вы столкнетесь с ошибками. В приведенном выше примере это означает, что вам нужно явно объявить канал в списке каналов, который называется подозрительным.
И если вы хотите отправить одно и то же сообщение журнала нескольким каналам, вы также можете выполнить «укладку».
Log::stack(['suspicious', 'slack'])->info("I have a bad feeling about this!");
Отправка контекстной информации
Иногда вы хотите отправить контекстную информацию, такую как конкретное имя файла, строка в файле или даже текущий вошедший в систему пользователь.
Вы можете написать свои индивидуальные сообщения журнала таким образом, чтобы добавить контекстную информацию:
Log::info('User login failed.', ['id' => $user->id, 'file' => __FILE__, 'line' => __LINE__]);
Эта команда передаст массив контекстных данных в методы журнала. Затем Laravel отформатирует контекстные данные и отобразит их вместе с сообщением журнала.
Форматирование сообщений журнала
Этот раздел о форматировании можно было бы разместить рядом с разделом драйверов и обработчиков в разделе «Объяснение файла конфигурации ведения журнала». Но я предпочитаю, чтобы «Форматирование сообщений журнала» было отдельным разделом, идущим после всего остального, потому что это имеет тенденцию быть менее важным.
Основная причина, по которой форматирование часто менее важно, заключается в том, что вы можете избежать необходимости использовать форматировщик по умолчанию, который использует драйвер Monolog - Monolog LineFormatter . Обычно этого более чем достаточно. Однако могут быть случаи, когда вы хотите настроить форматер, передаваемый обработчику. Это полный список форматеров, которые изначально предоставляет Monolog. Я заметил, что Monolog распределяет этот список по частоте использования. Так что это хороший список для ссылок, если вы хотите выбрать альтернативы.
Если вы хотите настроить форматер, вам нужно установить опцию форматера в соответствии с конкретной конфигурацией канала. Вы также заметите параметр formatter_with . Он работает аналогично тому, как описан параметр handler_with в разделе «Обработчики». Это способ отправки значений в метод конструктора класса форматера. Вот пример, где я использую следующий самый популярный форматер, HtmlFormatter:
'browser_console' => [
'driver' => 'monolog',
'handler' => MonologHandlerBrowserConsoleHandler::class,
'formatter' => MonologFormatterHtmlFormatter::class,
'formatter_with' => [
'dateFormat' => 'Y-m-d',
],
],
>
Иногда определенный обработчик Monolog поставляется со своим собственным форматером. В этом случае вы можете просто указать форматировщику использовать форматировщик этого обработчика по умолчанию.
Если вы используете обработчик Monolog, который может предоставить свой собственный модуль форматирования, вы можете установить значение параметра конфигурации средства форматирования по умолчанию:
'newrelic' => [
'driver' => 'monolog',
'handler' => MonologHandlerNewRelicHandler::class,
'formatter' => 'default',
],
Предыдущая: Laravel (5.7) Обработка ошибок
Далее: Шаблон лезвия Laravel (5.7)
Новый контент: Composer: менеджер зависимостей для PHP , R программирования