Ведение журнала Laravel: все, что вам нужно знать
Опубликовано: 2022-08-19При разработке современного приложения ведение журнала должно стоять на первом месте в списке приоритетов.
Ведение журнала позволяет визуализировать ваше приложение как в процессе разработки, так и в рабочей среде, обеспечивая прозрачность и видимость. Благодаря правильно структурированному журналированию современные приложения могут стать проще в обслуживании, поскольку мы можем заблаговременно выявлять точки сбоя и узкие места производительности в нашем приложении.
Фреймворк Laravel поставляется с надежной системой ведения журналов, которая справляется со всеми препятствиями, связанными с настройкой правильно структурированной системы ведения журналов из коробки. Эта новая система ведения журналов, представленная в Laravel 6.5, является мощной, и мы рассмотрим ее в этой статье.
В этой статье будут рассмотрены основы ведения журнала Laravel и причины, по которым вам следует использовать ведение журнала Laravel в своем следующем проекте. Мы подробно обсудим структурированное ведение журнала и централизованное ведение журнала. Кроме того, мы узнаем, как реализовать ведение журнала Laravel, создав приложение Todo.
Вы получите больше пользы от этой статьи, если у вас уже есть следующее:
- Хорошее знание веб-разработки
- Базовое понимание Laravel
- Создание приложений с Laravel
Что такое ведение журнала Laravel?
Ведение журнала Laravel — это то, как Laravel обрабатывает ведение журнала или автоматические отчеты о проблемах с использованием вирусной системы ведения журнала PHP под названием Monolog. Однако из-за философии Laravel, заключающейся в использовании популярных существующих библиотек для реализации различных функций фреймворка, Laravel использует Monolog для всех своих потребностей в ведении журналов.
Monolog — очень гибкая и популярная библиотека журналов PHP, которую мы можем настроить для отправки ваших журналов в файлы, сокеты, базы данных и другие веб-службы. Monolog предоставляет знакомый интерфейс для записи журналов из стандартных текстовых файлов в расширенные сторонние службы управления журналами. Laravel обычно настраивает Monolog на использование стандартного файла конфигурации ведения журнала.
Для получения дополнительной информации о Monolog и его функциях ознакомьтесь с официальной документацией, так как это выходит за рамки этой статьи.
Прежде чем мы углубимся в настройку и реализацию ведения журнала Laravel с помощью Monolog, давайте рассмотрим больше причин для использования ведения журнала Laravel и различных типов.
Зачем использовать ведение журнала Laravel?
Зачем нужно логирование?
В манифесте приложения Twelve-Factor ведение журнала рассматривается как одна из важнейших проблем современного приложения, поскольку ведение журнала является ключом к производительности и мониторингу.
Журналы помогают в подробном понимании ошибок, которые происходят в производстве, и их происхождения. Кроме того, с правильной структурой журнала он может показать конкретного пользователя, действие, вызвавшее ошибку, и возможное решение для более быстрого исправления ошибок и обслуживания.
Структурированное ведение журнала спасает жизнь в производственных приложениях, помогая устранять дефекты и решать проблемы в производственной среде. Кроме того, вы можете отслеживать и собирать все сообщения журнала в режиме реального времени, используя специализированные инструменты ведения журнала для оперативного анализа и составления отчетов.
По этим причинам вам необходимо сделать структурированное ведение журнала главным приоритетом в вашем следующем проекте современного приложения.
Давайте рассмотрим обзор различных доступных стилей ведения журнала.
Основы ведения журнала Laravel
Изучение основ ведения журнала поможет вам понять, как Laravel обрабатывает ведение журнала и как вы можете улучшить свои методы структурированного ведения журнала.
Давайте рассмотрим две основные концепции ведения журнала, чтобы лучше понять, как реализовать наши процедуры ведения журнала.
Структурированное ведение журнала Laravel
В разработке программного обеспечения структурированное ведение журнала реализует заранее определенный и согласованный формат сообщений для журналов приложений. Этот формат позволяет рассматривать сообщения как данные, которые можно отслеживать, обрабатывать и визуализировать гораздо лучше, чем в обычном текстовом формате.
Вы должны внедрить структурированный подход к ведению журналов при разработке современных приложений, потому что файлы журналов являются важными активами для разработчиков, когда что-то не так происходит с вашим приложением в рабочей среде.
Поскольку Laravel использует Monolog, разработчики могут быстро реализовать структурированное ведение журналов, настроив регистратор для получения определенных типов информации, сохраняя файлы журналов в разных форматах и отправляя журналы в различные сторонние службы управления журналами для визуализации.
Централизованное ведение журнала Laravel
В централизованной системе ведения журналов журналы отправляются в решения централизованного управления журналами (CLM) из нескольких источников для упрощения консолидации и визуализации. Однако CLM — это специализированное решение для ведения журнала, которое собирает сообщения журнала из разных источников и объединяет данные для упрощения обработки и визуализации.
Ожидается, что помимо сбора данных, CLM также будет поддерживать анализ данных каротажа и четкое представление данных после анализа.
Структурированное ведение журнала и базовое ведение журнала
Давайте рассмотрим разницу между структурированным ведением журнала и базовым (неструктурированным) ведением журнала и почему вы должны использовать структурированное ведение журнала в своем проекте Laravel.
Базовое ведение журнала
При базовой регистрации файлы журналов хранятся в необработанном формате с ограниченными данными для запроса и идентификации отдельных журналов.
При использовании базового ведения журнала разработчики не смогут использовать сторонние аналитические инструменты для чтения, просмотра и анализа журналов, если только они не разработают собственный инструмент или не будут использовать ограниченный инструмент, поддерживающий их формат журнала.
Есть три основные причины, по которым следует избегать использования базового ведения журнала:
- Централизованные системы управления журналами не могут работать с данными без дополнительной поддержки.
- Для чтения и анализа данных базового решения для ведения журналов требуется специальное решение.
- Администраторам может быть сложно читать основные данные журналов, поскольку они сырые и неструктурированные.
Структурированное ведение журнала
Структурированное ведение журналов экономит время разработчиков за счет использования сторонних инструментов анализа журналов с открытым исходным кодом, которые поддерживают стандартную структуру журналов для чтения, просмотра и анализа журналов.
Журналы полезны, если они содержат правильные данные, перечисленные ниже, что и является целью структурированного ведения журналов. Мы можем использовать данные, включенные в структурированное ведение журнала, для создания информационных панелей, графиков, диаграмм и любой другой полезной визуализации для определения работоспособности приложения.
Это основные примеры информации, которую мы можем включить в сообщения структурированного журнала. Кроме того, вы можете полностью настроить данные в соответствии с вашими потребностями.
Вот несколько примеров данных, которые можно собрать с помощью структурированного ведения журнала:
- Порт, используемый для выполнения функции
- Дата и время, когда произошло событие
- Имя пользователя или идентификатор клиента
- Описание события (сообщение журнала)
- Протокол, используемый для выполнения функции
- Местоположение инициированного события (укажите API или работающее приложение)
- Уникальный идентификатор события
- Тип инициированного действия (уровень журнала)
Журналы должны содержать достаточно данных, чтобы легко визуализировать решение или причину события журнала. Также обратите внимание, что не следует хранить в журналах все типы информации, такие как пароли или конфиденциальные данные.
Теперь, когда мы увидели, что такое ведение журнала Laravel, давайте перейдем к реализации ведения журнала Laravel, создав приложение с ведением журнала в качестве гражданина первого класса.
Как реализовать ведение журнала Laravel с помощью приложения Todo
Теперь мы собираемся применить то, что мы узнали, создав новый проект Laravel и внедрив ведение журнала Laravel.
Если вы раньше не использовали Laravel, вы можете прочитать, что такое Laravel, или просмотреть наш список отличных руководств по Laravel, чтобы начать работу.
Настройка Ларавеля
Во-первых, мы собираемся создать новый экземпляр Laravel, используя приведенную ниже команду. Вы можете найти официальную документацию для получения дополнительной информации.
Откройте консоль и перейдите туда, где вы храните свои проекты PHP, прежде чем запускать приведенные ниже команды. Убедитесь, что Composer установлен и настроен правильно.
composer create-project laravel/laravel laravel-logging-app cd laravel-logging-app // Change directory to current Laravel installation php artisan serve // Start Laravel development server
Настройка и заполнение базы данных
Далее мы настроим нашу базу данных, создадим новую модель Todo
и запустим 200 поддельных данных для тестирования.
Откройте клиент базы данных и создайте новую базу данных. Мы сделаем то же самое с именем laravel_logging_app_db
а затем заполним наш файл .env учетными данными базы данных:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_logging_app_db DB_USERNAME=//DB USERNAME HERE DB_PASSWORD=//DB PASSWORD HERE
Затем мы запустим следующую команду, чтобы одновременно создать миграцию и модель Todo
:
php artisan make:model Todo -mc
Откройте только что созданную базу данных миграции /migrations/xxx-create-todos-xxx.php и вставьте следующие коды:
<?php use IlluminateSupportFacadesSchema; use IlluminateDatabaseSchemaBlueprint; use IlluminateDatabaseMigrationsMigration; class CreateTodosTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('todos', function (Blueprint $table) { $table->id(); $table->string('title'); $table->text('description')->nullable(); $table->boolean('is_completed')->default(false); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('todos'); } }
Вы можете заполнить свои задачи фейковыми данными, научившись заполнять свои базы данных в Laravel с помощью Faker.
Обзор монолога
С Laravel Monolog вы можете передавать и отправлять структурированные журналы по различным каналам, таким как электронная почта, Slack, файлы, сокеты, почтовые ящики, базы данных и различные веб-сервисы. В Laravel вы можете настроить ведение журнала из одного файла конфигурации, расположенного в config/logging.php .
Файл конфигурации поставляется с предопределенными драйверами журналов на выбор, а драйвер по умолчанию представляет собой stack
, который использует single
канал для регистрации в файле laravel.log , который находится в папке storage/logs . Мы продемонстрируем структурированное ведение журнала, используя пару драйверов журнала Laravel.
Laravel предоставляет несколько методов для взаимодействия с логами, что вскоре продемонстрировано в файле контроллера TodosController.php .
Запись сообщений журнала в контроллере
Откройте вновь созданный файл контроллера TodosController.php в папке app/Http/Controllers и вставьте в него следующие коды:
<?php namespace AppHttpControllers; use AppModelsTodo; use IlluminateHttpRequest; use AppHttpControllersController; use IlluminateSupportFacadesAuth; use IlluminateSupportFacadesLog; class TodosController extends Controller { public function index(Request $request) { $todos = Todo::all(); Log::warning('User is accessing all the Todos', ['user' => Auth::user()->id]); return view('dashboard')->with(['todos' => $todos]); } public function byUserId(Request $request) { $todos = Todo::where('user_id', Auth::user()->id)->get(); Log::info('User is accessing all his todos', ['user' => Auth::user()->id]); return view('dashboard')->with(['todos' => $todos]); } public function show(Request $request, $id) { $todo = Todo::find($id); Log::info('User is accessing a single todo', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show')->with(['todo' => $todo]); } public function update(Request $request, $id) { # Validations before updating $todo = Todo::where('user_id', Auth::user()->id)->where('id', $id)->first(); Log::warning('Todo found for updating by user', ['user' => Auth::user()->id, 'todo' => $todo]); if ($todo) { $todo->title = $request->title; $todo->desc = $request->desc; $todo->status = $request->status == 'on' ? 1 : 0; if ($todo->save()) { Log::info('Todo updated by user successfully', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show', ['todo' => $todo]); } Log::warning('Todo could not be updated caused by invalid todo data', ['user' => Auth::user()->id, 'todo' => $todo->id, 'data' => $request->except('password')]); return; // 422 } Log::error('Todo not found by user', ['user' => Auth::user()->id, 'todo' => $id]); return; // 401 } public function store(Request $request) { Log::warning('User is trying to create a single todo', ['user' => Auth::user()->id, 'data' => $request->except('password')]); # Validations before updating $todo = new Todo; $todo->title = $request->title; $todo->desc = $request->desc; $todo->user_id = Auth::user()->id; if ($todo->save()) { Log::info('User create a single todo successfully', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show', ['todo' => $todo]); } Log::warning('Todo could not be created caused by invalid todo data', ['user' => Auth::user()->id, 'data' => $request->except('password')]); return; // 422 } public function delete(Request $request, $id) { Log::warning('User is trying to delete a single todo', ['user' => Auth::user()->id, 'todo' => $id]); $todo = Todo::where('user_id', Auth::user()->id)->where('id', $id)->first(); if ($todo) { Log::info('User deleted a single todo successfully', ['user' => Auth::user()->id, 'todo' => $id]); $todo->delete(); return view('index'); } Log::error('Todo not found by user for deleting', ['user' => Auth::user()->id, 'todo' => $id]); return; // 404 } }
В каждом из методов TodoController
мы добавили фасад Log
с определенным уровнем журнала, чтобы определить тип ошибки, которую мы хотим отправить. Ниже приведен пример использования
Бревенчатый фасад store
способом.
public function store(Request $request) { Log::warning('User is trying to create a single todo', ['user' => Auth::user()->id, 'data' => $request->except('password')]); # Validations before updating $todo = new Todo; $todo->title = $request->title; $todo->desc = $request->desc; $todo->user_id = Auth::user()->id; if ($todo->save()) { Log::info('User create a single todo successfully', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show', ['todo' => $todo]); } Log::warning('Todo could not be created caused by invalid todo data', ['user' => Auth::user()->id, 'data' => $request->except('password')]); return; // 422 }
Форматирование сообщений журнала
Предположим, вам не LineFormatter
по умолчанию, используемый Laravel, который отлично справляется с предоставлением читаемых и полезных сообщений.
В этом случае вы можете легко развернуть настраиваемый объект форматирования в соответствии с вашим вариантом использования и использовать его во всем приложении.
Официальная документация Monolog дает полный список доступных средств форматирования и позволяет легко создать собственное.
В Laravel вы можете легко настроить любой из драйверов на использование вашего собственного средства форматирования, добавив его в список, как показано ниже, внутри файла конфигурации, расположенного в config/logging.php :
'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), 'days' => 14, 'formatter' => MonologFormatterHtmlFormatter::class, 'formatter_with' => [ 'dateFormat' => 'Ym-d', ] ],
В приведенном выше примере к daily
драйверу добавляется пользовательский MonologFormatterHtmlFormatter
с использованием formatter
и ключа formatter_with
в конфигурации daily
канала для изменения формата дат.
Отправка журналов на разные каналы
С помощью Monolog Laravel может отправлять журналы на разные каналы и несколько каналов одновременно.
Давайте продемонстрируем, как отправлять журналы в наш канал Slack, выполнив эти простые шаги. Измените канал журнала по умолчанию на Slack и добавьте URL-адрес Slack Webhook в свой файл .env .
LOG_CHANNEL=slack LOG_SLACK_WEBBHOOK_URL= Slack_webhook_url_here
Затем проверьте свою конфигурацию, зарегистрировав сообщение в своем приложении с помощью фасада Log
, как показано ниже:
Log::debug("The API instance is on fire caused by:", ['user' => 1])
Вы можете открыть свой канал Slack, чтобы проверить наличие ошибки, напечатанной в нужном канале, который вы указали при создании URL-адреса веб-перехватчика.
Резюме
Ведение журнала так же важно, как и любой другой фактор вашего приложения, если не больше. Вот почему в манифесте приложения Twelve-Factor это предлагается как одна из наиболее важных проблем любого современного приложения.
Благодаря эффективному ведению журналов вы можете легко читать, просматривать и визуализировать ошибки и дефекты, возникающие в вашем готовом к работе приложении. Для этого важно внедрить структурированное ведение журнала в приложение с самого начала проекта.
В этой статье мы рассмотрели ведение журнала Laravel и то, почему вы должны использовать его в своем следующем проекте. Мы подробно обсудили как структурированное ведение журнала, так и централизованное ведение журнала. Кроме того, мы узнали, как реализовать ведение журнала Laravel, создав приложение Todo.
Как вы планируете реализовать вход в свое следующее приложение? Дайте нам знать в разделе комментариев.