Logowanie Laravel: wszystko, co musisz wiedzieć
Opublikowany: 2022-08-19Podczas tworzenia nowoczesnej aplikacji rejestrowanie powinno znajdować się na szczycie listy priorytetów.
Rejestrowanie umożliwia wizualizację aplikacji zarówno w fazie rozwoju, jak i produkcji, zapewniając przejrzystość i widoczność. Dzięki odpowiednio ustrukturyzowanemu rejestrowaniu nowoczesne aplikacje mogą stać się łatwiejsze w utrzymaniu, ponieważ możemy proaktywnie identyfikować punkty awarii i wąskie gardła wydajności w naszej aplikacji.
Framework Laravel jest dostarczany z solidnym systemem rejestrowania, który obsługuje wszystkie przeszkody związane z konfiguracją odpowiednio ustrukturyzowanego systemu rejestrowania po wyjęciu z pudełka. Ten nowy system logowania wprowadzony w Laravel 6.5 jest potężny i omówimy go w tym artykule.
W tym artykule omówimy podstawy logowania Laravel i dlaczego powinieneś używać logowania Laravel w swoim następnym projekcie. Omówimy szczegółowo rejestrowanie strukturalne i rejestrowanie scentralizowane. Ponadto dowiemy się, jak zaimplementować logowanie Laravela, budując aplikację Todo.
Wyciągniesz więcej z tego artykułu, jeśli masz już za sobą następujące rzeczy:
- Dobra znajomość tworzenia stron internetowych
- Podstawowe zrozumienie Laravel
- Tworzenie aplikacji z Laravel
Co to jest logowanie Laravela?
Logowanie Laravela dotyczy tego, jak Laravel obsługuje logowanie lub automatyczne raportowanie problemów, używając wirusowego systemu logowania PHP o nazwie Monolog. Jednak ze względu na filozofię Laravela polegającą na używaniu popularnych istniejących bibliotek do implementacji różnych funkcji frameworka, Laravel wykorzystuje Monolog do wszystkich swoich potrzeb związanych z logowaniem.
Monolog to bardzo elastyczna i popularna biblioteka dzienników PHP, którą możemy skonfigurować tak, aby wysyłać dzienniki do plików, gniazd, baz danych i innych usług internetowych. Monolog zapewnia znajomy interfejs do zapisywania dzienników od standardowych plików tekstowych po zaawansowane usługi zarządzania dziennikami innych firm. Laravel zazwyczaj ustawia Monolog tak, aby używał standardowego pliku konfiguracyjnego rejestrowania.
Aby uzyskać więcej informacji o Monolog i jego funkcjach, zapoznaj się z oficjalną dokumentacją, ponieważ wykracza to poza zakres tego artykułu.
Zanim zagłębimy się w konfigurację i implementację logowania Laravel za pomocą Monolog, przyjrzyjmy się większej liczbie powodów, dla których warto korzystać z logowania Laravel i różnych typów.
Dlaczego warto korzystać z rejestrowania Laravel?
Dlaczego logowanie jest konieczne?
Manifest aplikacji Twelve-Factor traktuje rejestrowanie jako jeden z krytycznych problemów nowoczesnej aplikacji, ponieważ rejestrowanie jest kluczem do wydajności i monitorowania.
Dzienniki pomagają w dokładnym zrozumieniu błędów występujących w produkcji i ich pochodzenia. Ponadto, dzięki odpowiedniej strukturze dziennika, może pokazać konkretnego użytkownika, akcję, która spowodowała błąd i możliwe rozwiązanie w celu szybszego naprawiania błędów i konserwacji.
Rejestrowanie strukturalne ratuje życie w aplikacjach produkcyjnych, pomagając w rozwiązywaniu defektów i rozwiązywaniu problemów w produkcji. Ponadto można monitorować i zbierać wszystkie komunikaty dziennika w czasie rzeczywistym za pomocą specjalistycznych narzędzi do rejestrowania w celu analizy i raportowania na żywo.
Z tych powodów musisz nadać uporządkowanemu rejestrowaniu najwyższy priorytet w kolejnym projekcie nowoczesnej aplikacji.
Przyjrzyjmy się przeglądowi różnych dostępnych stylów rejestrowania.
Podstawy rejestrowania Laravel
Poznanie podstaw logowania pomoże ci zrozumieć, jak Laravel radzi sobie z logowaniem i jak możesz ulepszyć swoje ustrukturyzowane praktyki logowania.
Przyjrzyjmy się dwóm podstawowym pojęciom związanym z rejestrowaniem, aby lepiej zrozumieć, jak wdrożyć nasze procedury rejestrowania.
Logowanie strukturalne Laravel
W rozwoju oprogramowania rejestrowanie strukturalne implementuje z góry określony i spójny format komunikatów dla dzienników aplikacji. Ten format umożliwia traktowanie wiadomości jako danych, które można monitorować, manipulować i wizualizować znacznie lepiej niż zwykły format tekstowy.
Musisz zaimplementować podejście do rejestrowania strukturalnego w swoim nowoczesnym opracowywaniu aplikacji, ponieważ pliki dziennika są podstawowymi zasobami dla programistów, gdy coś nie tak dzieje się z Twoją aplikacją w środowisku produkcyjnym.
Ponieważ Laravel korzysta z Monolog, programiści mogą szybko wdrożyć ustrukturyzowane rejestrowanie, konfigurując rejestrator do odbierania określonych typów informacji, przechowując pliki dziennika w różnych formatach i wysyłając dzienniki do różnych usług zarządzania dziennikami innych firm w celu wizualizacji.
Scentralizowane rejestrowanie Laravel
Scentralizowany system rejestrowania to miejsce, w którym dzienniki są przesyłane do rozwiązań scentralizowanego zarządzania dziennikami (CLM) z wielu źródeł w celu łatwej konsolidacji i wizualizacji. Jednak CLM jest wyspecjalizowanym rozwiązaniem rejestrującym, które zbiera komunikaty dziennika z różnych źródeł i konsoliduje dane w celu łatwego przetwarzania i wizualizacji.
Oprócz zbierania danych, CLM ma również wspierać analizę danych dziennika i przejrzystą prezentację danych po analizie.
Rejestrowanie strukturalne a rejestrowanie podstawowe
Przyjrzyjmy się różnicy między rejestrowaniem strukturalnym a rejestrowaniem podstawowym (niestrukturalnym) i dlaczego warto używać rejestrowania strukturalnego w projekcie Laravel.
Logowanie podstawowe
W podstawowym logowaniu pliki logów są przechowywane w formacie surowym z ograniczonymi danymi do zapytania i identyfikacji poszczególnych logów.
Korzystając z rejestrowania podstawowego, programiści nie będą mogli używać narzędzi analitycznych innych firm do odczytywania, przeglądania i analizowania dzienników, chyba że opracują niestandardowe narzędzie lub będą trzymać się ograniczonego narzędzia, które obsługuje ich format dziennika.
Istnieją trzy ważne powody, dla których warto unikać podstawowego logowania:
- Scentralizowane systemy zarządzania logami nie mogą pracować z danymi bez dodatkowego wsparcia.
- Do odczytywania i analizowania danych podstawowego rozwiązania do rejestrowania wymagane jest niestandardowe rozwiązanie.
- Odczytywanie podstawowych danych rejestrowania może być trudne dla administratorów, ponieważ są one nieprzetworzone i nieustrukturyzowane.
Rejestrowanie strukturalne
Rejestrowanie strukturalne oszczędza czas programistów dzięki korzystaniu z narzędzi do analizy dzienników typu open source innych firm, które obsługują standardową strukturę dzienników w celu odczytywania, przeglądania i analizowania dzienników.
Logi są pomocne, jeśli zawierają prawidłowe dane wymienione poniżej, do czego dąży logowanie strukturalne. Możemy wykorzystać dane zawarte w logowaniu strukturalnym do tworzenia pulpitów nawigacyjnych, wykresów, wykresów i wszelkich innych pomocnych wizualizacji w celu określenia stanu aplikacji.
To są podstawowe przykłady informacji, które możemy zawrzeć w ustrukturyzowanych komunikatach dziennika. Ponadto możesz całkowicie dostosować dane do swoich potrzeb.
Oto kilka przykładów danych, które można zbierać za pomocą rejestrowania strukturalnego:
- Port używany do wykonywania funkcji
- Data i godzina zdarzenia
- Nazwa użytkownika lub identyfikator klienta
- Opis zdarzenia (komunikat dziennika)
- Protokół używany do wykonania funkcji
- Lokalizacja wyzwolonego zdarzenia (wskaż API lub uruchomioną aplikację)
- Unikalny identyfikator wydarzenia
- Typ wyzwolonej akcji (poziom rejestrowania)
Dzienniki powinny zawierać wystarczającą ilość danych, aby łatwo zwizualizować rozwiązanie lub przyczynę zdarzenia w dzienniku. Należy również pamiętać, że nie należy przechowywać w dziennikach wszystkich rodzajów informacji, takich jak hasła lub poufne dane.
Teraz, gdy już zorientowaliśmy się, o co chodzi w logowaniu w Laravelu, przejdźmy do implementacji logowania w Laravelu, budując aplikację z logowaniem jako obywatel najwyższej klasy.
Jak wdrożyć logowanie Laravel za pomocą aplikacji Todo?
Teraz zastosujemy to, czego nauczyliśmy się do tej pory, tworząc nowy projekt Laravel i wdrażając logowanie Laravel.
Jeśli nie korzystałeś wcześniej z Laravela, możesz przeczytać, czym jest Laravel lub zajrzeć do naszej listy doskonałych samouczków Laravela, aby rozpocząć.
Konfiguracja Laravela
Najpierw utworzymy nową instancję Laravela za pomocą poniższego polecenia. Więcej informacji można znaleźć w oficjalnej dokumentacji.
Otwórz konsolę i przejdź do miejsca, w którym przechowujesz swoje projekty PHP przed uruchomieniem poniższych poleceń. Upewnij się, że Composer jest poprawnie zainstalowany i skonfigurowany.
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
Konfigurowanie i uruchamianie bazy danych
Następnie skonfigurujemy naszą bazę danych, stworzymy nowy model Todo
i wyślemy 200 fałszywych danych do testów.

Otwórz klienta bazy danych i utwórz nową bazę danych. Zrobimy to samo z nazwą laravel_logging_app_db
, a następnie wypełnimy nasz plik .env danymi logowania do bazy danych:
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
Następnie uruchomimy następujące polecenie, aby jednocześnie utworzyć migrację i model Todo
:
php artisan make:model Todo -mc
Otwórz nowo utworzoną migrację znalezioną database/migrations/xxx-create-todos-xxx.php i wklej następujące kody:
<?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'); } }
Możesz obsadzić listę rzeczy do zrobienia fałszywymi danymi, ucząc się umieszczania swoich baz danych w Laravel za pomocą Fakera.
Przegląd Monologa
Dzięki Laravel Monolog możesz przesyłać strumieniowo i wysyłać uporządkowane logi do różnych kanałów, takich jak e-maile, Slack, pliki, gniazda, skrzynki odbiorcze, bazy danych i różne usługi sieciowe. W Laravelu możesz skonfigurować logowanie z jednego pliku konfiguracyjnego znajdującego się w config/logging.php .
Plik konfiguracyjny zawiera wstępnie zdefiniowane sterowniki dziennika do wyboru, a domyślny sterownik to stack
, który używa single
kanału do logowania do pliku laravel.log znajdującego się w folderze storage/logs . Zademonstrujemy logowanie strukturalne przy użyciu kilku sterowników logów Laravel.
Laravel dostarcza garść metod interakcji z logami, co zostało krótko zademonstrowane w pliku kontrolera TodosController.php .
Zapisywanie komunikatów dziennika w kontrolerze
Otwórz nowo utworzony plik kontrolera TodosController.php znaleziony w folderze app/Http/Controllers i wklej następujące kody:
<?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 } }
W ramach każdej z metod w TodoController
dodaliśmy fasadę Log
z określonym poziomem dziennika, aby zdefiniować typ błędu, który chcemy wysłać. Poniżej znajduje się przykład użycia
Elewacja z bali w metodzie 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 }
Formatowanie komunikatów dziennika
Załóżmy, że nie czujesz się komfortowo z domyślnym LineFormatter
używanym przez Laravela, który świetnie sprawdza się w dostarczaniu czytelnych i pomocnych komunikatów.
W takim przypadku możesz łatwo uruchomić dostosowany obiekt formatujący, aby dopasować go do przypadku użycia i używać go w całej aplikacji.
Oficjalna dokumentacja Monolog zawiera pełną listę dostępnych formaterów i umożliwia łatwe tworzenie własnych.
W Laravelu możesz łatwo ustawić dowolny sterownik, aby używał Twojego niestandardowego programu formatującego, dodając go do listy, jak poniżej, w pliku konfiguracyjnym znajdującym się w 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', ] ],
Powyższy przykład dodaje niestandardowy MonologFormatterHtmlFormatter
do daily
sterownika przy użyciu klucza formatter
i formatter_with
w konfiguracji kanału daily
, aby zmienić format dat.
Wysyłanie dzienników do różnych kanałów
Za pomocą Monolog Laravel może wysyłać logi do różnych kanałów i wielu kanałów jednocześnie.
Zademonstrujmy, jak wysyłać logi do naszego kanału Slack, wykonując te proste czynności. Zmień domyślny kanał dziennika na Slack i dodaj adres URL webhooka Slack w pliku .env .
LOG_CHANNEL=slack LOG_SLACK_WEBBHOOK_URL= Slack_webhook_url_here
Następnie przetestuj swoją konfigurację, logując komunikat w aplikacji przy użyciu fasady Log
, takiej jak pokazana poniżej:
Log::debug("The API instance is on fire caused by:", ['user' => 1])
Możesz otworzyć swój kanał Slack, aby sprawdzić błąd wydrukowany w żądanym kanale określonym podczas generowania adresu URL webhooka.
Streszczenie
Logowanie jest tak samo ważne, jak każdy inny czynnik Twojej aplikacji, jeśli nie bardziej. Dlatego jest sugerowany w manifeście aplikacji Twelve-Factor jako jeden z najbardziej krytycznych problemów każdej nowoczesnej aplikacji.
Dzięki efektywnemu rejestrowaniu można łatwo odczytywać, przeglądać i wizualizować błędy i defekty występujące w aplikacji gotowej do produkcji. W tym celu ważne jest, aby zaimplementować logowanie strukturalne do aplikacji od samego początku projektu.
W tym artykule zbadaliśmy logowanie Laravela i dlaczego warto go używać w następnym projekcie. Szczegółowo omówiliśmy zarówno rejestrowanie strukturalne, jak i rejestrowanie scentralizowane. Ponadto dowiedzieliśmy się, jak zaimplementować logowanie Laravela, budując aplikację Todo.
Jak planujesz wdrożyć logowanie do następnej aplikacji? Daj nam znać w sekcji komentarzy.