Laravel-Protokollierung: Alles, was Sie wissen müssen

Veröffentlicht: 2022-08-19

Bei der Entwicklung einer modernen Anwendung sollte die Protokollierung ganz oben auf der Prioritätenliste stehen.

Die Protokollierung bietet eine Möglichkeit, Ihre App sowohl in der Entwicklung als auch in der Produktion zu visualisieren und Transparenz und Sichtbarkeit zu ermöglichen. Mit einer richtig strukturierten Protokollierung können moderne Anwendungen einfacher zu warten sein, da wir Fehlerquellen und Leistungsengpässe in unserer App proaktiv identifizieren können.

Das Laravel-Framework wird mit einem robusten Protokollierungssystem geliefert, das alle Hürden bewältigt, die mit der Konfiguration eines ordnungsgemäß strukturierten Protokollierungssystems verbunden sind. Dieses neue Protokollierungssystem, das in Laravel 6.5 eingeführt wurde, ist leistungsstark und wir werden es in diesem Artikel untersuchen.

In diesem Artikel werden die Grundlagen der Laravel-Protokollierung erläutert und warum Sie die Laravel-Protokollierung in Ihrem nächsten Projekt verwenden sollten. Wir werden die strukturierte Protokollierung und die zentralisierte Protokollierung im Detail besprechen. Darüber hinaus lernen wir, wie man die Laravel-Protokollierung implementiert, indem man eine Todo-Anwendung erstellt.

Sie werden mehr aus diesem Artikel herausholen, wenn Sie bereits Folgendes auf dem Buckel haben:

  • Gute Kenntnisse in der Webentwicklung
  • Grundlegendes Verständnis von Laravel
  • Apps mit Laravel erstellen

Was ist Laravel-Protokollierung?

Bei der Laravel-Protokollierung dreht sich alles darum, wie Laravel die Protokollierung oder die automatische Problemmeldung mit einem viralen PHP-Protokollierungssystem namens Monolog handhabt. Aufgrund der Philosophie von Laravel, beliebte vorhandene Bibliotheken zu verwenden, um verschiedene Framework-Funktionen zu implementieren, verwendet Laravel jedoch Monolog für alle seine Protokollierungsanforderungen.

Monolog ist eine hochflexible und beliebte PHP-Protokollierungsbibliothek, die wir so konfigurieren können, dass Ihre Protokolle an Dateien, Sockets, Datenbanken und andere Webdienste gesendet werden. Monolog bietet eine vertraute Benutzeroberfläche zum Schreiben von Protokollen aus Standardtextdateien in erweiterte Protokollverwaltungsdienste von Drittanbietern. Laravel richtet Monolog normalerweise so ein, dass es eine standardmäßige Protokollierungskonfigurationsdatei verwendet.

Weitere Informationen zu Monolog und seinen Funktionen finden Sie in der offiziellen Dokumentation, da dies den Rahmen dieses Artikels sprengen würde.

Bevor wir uns mit der Konfiguration und Implementierung der Laravel-Protokollierung mit Monolog befassen, wollen wir weitere Gründe für die Verwendung der Laravel-Protokollierung und die verschiedenen Typen untersuchen.

Warum Laravel-Protokollierung verwenden?

Warum ist eine Protokollierung erforderlich?

Das Twelve-Factor App-Manifest behandelt die Protokollierung als eines der kritischen Anliegen einer modernen Anwendung, da die Protokollierung ein Schlüssel zu Leistung und Überwachung ist.

Protokolle helfen beim detaillierten Verständnis von Fehlern, die in der Produktion auftreten und wo sie ihren Ursprung haben. Darüber hinaus kann es mit geeigneten Protokollstrukturen den jeweiligen Benutzer, die Aktion, die den Fehler verursacht hat, und die mögliche Lösung für eine schnellere Fehlerbehebung und Wartung anzeigen.

Die strukturierte Protokollierung ist ein Lebensretter in Produktionsanwendungen, indem sie hilft, Fehler zu beheben und Probleme in der Produktion zu lösen. Darüber hinaus können Sie alle Ihre Protokollmeldungen in Echtzeit überwachen und sammeln, indem Sie spezielle Protokollierungstools für Live-Analysen und Berichte verwenden.

Aus diesen Gründen müssen Sie der strukturierten Protokollierung in Ihrem nächsten modernen Anwendungsprojekt höchste Priorität einräumen.

Schauen wir uns die Übersicht der verschiedenen verfügbaren Protokollierungsstile an.

Grundlagen der Laravel-Protokollierung

Das Erlernen der Grundlagen der Protokollierung hilft Ihnen zu verstehen, wie Laravel mit der Protokollierung umgeht und wie Sie Ihre strukturierten Protokollierungspraktiken verbessern können.

Lassen Sie uns zwei wesentliche Konzepte der Protokollierung untersuchen, um besser zu verstehen, wie unsere Protokollierungsprozeduren implementiert werden.

Strukturierte Laravel-Protokollierung

In der Softwareentwicklung implementiert die strukturierte Protokollierung ein vorgegebenes und konsistentes Nachrichtenformat für Anwendungsprotokolle. Dieses Format ermöglicht es, die Nachrichten als Daten zu behandeln, die viel besser überwacht, manipuliert und visualisiert werden können als das normale Textformat.

Sie müssen in Ihrer modernen Anwendungsentwicklung einen strukturierten Protokollierungsansatz implementieren, da Protokolldateien die wesentlichen Ressourcen für Entwickler sind, wenn mit Ihrer Anwendung in der Produktion ein Fehler auftritt.

Da Laravel Monolog verwendet, können Entwickler schnell eine strukturierte Protokollierung implementieren, indem sie den Logger so konfigurieren, dass er bestimmte Arten von Informationen empfängt, die Protokolldateien in verschiedenen Formaten speichert und die Protokolle zur Visualisierung an verschiedene Protokollverwaltungsdienste von Drittanbietern sendet.

Laravel zentralisierte Protokollierung

Bei einem zentralisierten Protokollierungssystem werden Protokolle zur einfachen Konsolidierung und Visualisierung aus mehreren Quellen an Centralized Log Management (CLM)-Lösungen gesendet. CLM ist jedoch eine spezialisierte Protokollierungslösung, die Protokollmeldungen aus verschiedenen Quellen sammelt und die Daten zur einfachen Verarbeitung und Visualisierung konsolidiert.

Neben der Datenerfassung soll CLM auch die Analyse von Protokolldaten und die übersichtliche Darstellung der Daten nach der Analyse unterstützen.

Strukturierte Protokollierung vs. einfache Protokollierung

Lassen Sie uns den Unterschied zwischen strukturierter Protokollierung und einfacher (unstrukturierter) Protokollierung untersuchen und warum Sie strukturierte Protokollierung in Ihrem Laravel-Projekt verwenden sollten.

Grundlegende Protokollierung

Bei der einfachen Protokollierung werden die Protokolldateien in einem Rohformat mit begrenzten Daten gespeichert, um einzelne Protokolle abzufragen und zu identifizieren.

Bei Verwendung der einfachen Protokollierung können Entwickler keine Analysetools von Drittanbietern verwenden, um Protokolle zu lesen, anzuzeigen und zu analysieren, es sei denn, sie entwickeln ein benutzerdefiniertes Tool oder bleiben bei einem eingeschränkten Tool, das ihr Protokollformat unterstützt.

Es gibt drei wichtige Gründe, die einfache Protokollierung zu vermeiden:

  1. Zentralisierte Log-Management-Systeme können ohne zusätzliche Unterstützung nicht mit den Daten arbeiten.
  2. Eine angepasste Lösung ist erforderlich, um die Daten einer einfachen Protokollierungslösung zu lesen und zu parsen.
  3. Für Administratoren kann es schwierig sein, grundlegende Protokolldaten zu lesen, da sie roh und unstrukturiert sind.

Strukturierte Protokollierung

Die strukturierte Protokollierung spart Entwicklern Zeit, indem sie Open-Source-Protokollanalysetools von Drittanbietern verwenden, die die Standardprotokollstruktur zum Lesen, Anzeigen und Analysieren von Protokollen unterstützen.

Protokolle sind hilfreich, wenn sie die unten aufgeführten korrekten Daten enthalten, was das Ziel der strukturierten Protokollierung ist. Wir können die in der strukturierten Protokollierung enthaltenen Daten verwenden, um Dashboards, Grafiken, Diagramme und andere hilfreiche Visualisierungen zu erstellen, um den Zustand der Anwendung zu bestimmen.

Dies sind grundlegende Beispiele für die Informationen, die wir in strukturierte Protokollnachrichten aufnehmen können. Darüber hinaus können Sie die Daten vollständig an Ihre Bedürfnisse anpassen.

Hier sind einige Beispiele für die Daten, die Sie mit der strukturierten Protokollierung sammeln können:

  1. Der Port, der zum Ausführen der Funktion verwendet wird
  2. Datum und Uhrzeit des Ereignisses
  3. Der Benutzername oder die ID des Kunden
  4. Eine Beschreibung des Ereignisses (Protokollmeldung)
  5. Das zum Ausführen der Funktion verwendete Protokoll
  6. Der Ort des ausgelösten Ereignisses (geben Sie API oder laufende App an)
  7. Die eindeutige Ereignis-ID
  8. Die Art der ausgelösten Aktion (Protokollebene)

Protokolle sollten genügend Daten enthalten, um die Lösung oder den Grund für das Protokollereignis einfach zu visualisieren. Beachten Sie außerdem, dass Sie nicht alle Arten von Informationen wie Passwörter oder sensible Daten in Protokollen speichern sollten.

Nachdem wir nun gesehen haben, worum es bei der Laravel-Protokollierung geht, wollen wir mit der Implementierung der Laravel-Protokollierung fortfahren, indem wir eine Anwendung mit Protokollierung als erstklassiger Bürger erstellen.

So implementieren Sie die Laravel-Protokollierung mit der Todo-App

Jetzt werden wir das bisher Gelernte anwenden, indem wir ein neues Laravel-Projekt erstellen und die Laravel-Protokollierung implementieren.

Wenn Sie Laravel noch nie verwendet haben, können Sie sich durchlesen, was Laravel ist, oder einen Blick auf unsere Liste hervorragender Laravel-Tutorials werfen, um loszulegen.

Laravel einrichten

Zuerst erstellen wir mit dem folgenden Befehl eine neue Laravel-Instanz. Weitere Informationen finden Sie in der offiziellen Dokumentation.

Öffnen Sie Ihre Konsole und navigieren Sie zu dem Ort, an dem Sie Ihre PHP-Projekte speichern, bevor Sie die folgenden Befehle ausführen. Stellen Sie sicher, dass Composer korrekt installiert und konfiguriert ist.

 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

Konfigurieren und Seeding der Datenbank

Als Nächstes richten wir unsere Datenbank ein, erstellen ein neues Todo -Modell und setzen 200 gefälschte Daten zum Testen ein.

Öffnen Sie Ihren Datenbankclient und erstellen Sie eine neue Datenbank. Wir machen dasselbe mit dem Namen laravel_logging_app_db und füllen dann unsere .env -Datei mit den Datenbankanmeldeinformationen:

 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

Als Nächstes führen wir den folgenden Befehl aus, um die Migration und das Todo -Modell gleichzeitig zu erstellen:

 php artisan make:model Todo -mc

Öffnen Sie die neu erstellte gefundene Migration database/migrations/xxx-create-todos-xxx.php und fügen Sie die folgenden Codes ein:

 <?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'); } }

Sie können Ihre Todos mit gefälschten Daten füllen, indem Sie lernen, Ihre Datenbanken in Laravel mit Faker zu füllen.

Kämpfen Sie mit Ausfallzeiten und WordPress-Problemen? Kinsta ist die Hosting-Lösung, die entwickelt wurde, um dir Zeit zu sparen! Schauen Sie sich unsere Funktionen an

Überblick über Monolog

Mit Laravel Monolog können Sie strukturierte Protokolle streamen und an verschiedene Kanäle wie E-Mails, Slack, Dateien, Sockets, Posteingänge, Datenbanken und verschiedene Webdienste senden. In Laravel können Sie die Protokollierung über eine einzige Konfigurationsdatei konfigurieren, die sich in config/logging.php befindet .

Die Konfigurationsdatei enthält vordefinierte Protokolltreiber zur Auswahl, und der Standardtreiber ist ein stack , der den single Kanal verwendet, um sich in einer laravel.log -Datei zu protokollieren, die sich im Ordner „ storage/logs “ befindet. Wir werden die strukturierte Protokollierung anhand einiger Laravel-Protokolltreiber demonstrieren.

Laravel bietet eine Handvoll Methoden zur Interaktion mit Protokollen, wie in Kürze allgemein in der Controller-Datei TodosController.php demonstriert wird.

Protokollmeldungen in den Controller schreiben

Öffnen Sie die neu erstellte Controller-Datei TodosController.php im Ordner app/Http/Controllers und fügen Sie die folgenden Codes ein:

 <?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 } }

Innerhalb jeder der Methoden im TodoController haben wir die Log mit einer bestimmten Protokollebene hinzugefügt, um die Art des Fehlers zu definieren, den wir senden möchten. Nachfolgend finden Sie ein Beispiel für die Verwendung von

Log-Fassade im store Verfahren.

 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 }

Protokollmeldungen formatieren

Angenommen, Sie sind mit dem von Laravel verwendeten Standard LineFormatter nicht vertraut, der hervorragende Arbeit leistet, um lesbare und hilfreiche Nachrichten bereitzustellen.

In diesem Fall können Sie ganz einfach ein benutzerdefiniertes Formatierungsobjekt erstellen, das zu Ihrem Anwendungsfall passt, und es in der gesamten Anwendung verwenden.

Die offizielle Monolog-Dokumentation enthält eine vollständige Liste der verfügbaren Formatierer und kann leicht einen benutzerdefinierten erstellen.

In Laravel können Sie einfach jeden der Treiber so einstellen, dass er Ihren benutzerdefinierten Formatierer verwendet, indem Sie ihn wie unten in der Konfigurationsdatei unter config/logging.php zur Liste hinzufügen:

 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), 'days' => 14, 'formatter' => MonologFormatterHtmlFormatter::class, 'formatter_with' => [ 'dateFormat' => 'Ym-d', ] ],

Das obige Beispiel fügt dem daily Treiber einen benutzerdefinierten MonologFormatterHtmlFormatter hinzu, indem der Schlüssel formatter und formatter_with in der Konfiguration des daily Kanals verwendet wird, um das Datumsformat zu ändern.

Senden von Protokollen an verschiedene Kanäle

Mit Hilfe von Monolog kann Laravel Protokolle an verschiedene Kanäle und mehrere Kanäle gleichzeitig senden.

Lassen Sie uns anhand dieser einfachen Schritte demonstrieren, wie Sie Protokolle an unseren Slack-Kanal senden. Ändern Sie den Standardprotokollkanal in Slack und fügen Sie die Slack-Webhook-URL in Ihre .env -Datei ein.

 LOG_CHANNEL=slack LOG_SLACK_WEBBHOOK_URL= Slack_webhook_url_here

Testen Sie als Nächstes Ihre Konfiguration, indem Sie eine Nachricht in Ihrer Anwendung protokollieren, indem Sie die Log wie die unten gezeigte verwenden:

 Log::debug("The API instance is on fire caused by:", ['user' => 1])

Sie können Ihren Slack-Kanal öffnen, um nach dem Fehler zu suchen, der in dem gewünschten Kanal gedruckt wird, den Sie beim Generieren der Webhook-URL angegeben haben.

Zusammenfassung

Die Protokollierung ist genauso wichtig wie jeder andere Faktor Ihrer Anwendung, wenn nicht sogar noch wichtiger. Aus diesem Grund wird es vom Twelve-Factor App-Manifest als eines der kritischsten Anliegen jeder modernen Anwendung vorgeschlagen.

Mit effektiver Protokollierung können Sie Fehler und Defekte, die in Ihrer produktionsbereiten Anwendung auftreten, einfach lesen, anzeigen und visualisieren. Dazu ist es wichtig, dass Sie bereits zu Projektbeginn eine strukturierte Anmeldung in Ihrer Anwendung implementieren.

In diesem Artikel haben wir die Laravel-Protokollierung untersucht und warum Sie sie in Ihrem nächsten Projekt verwenden sollten. Wir haben sowohl die strukturierte Protokollierung als auch die zentralisierte Protokollierung ausführlich besprochen. Darüber hinaus haben wir gelernt, wie man die Laravel-Protokollierung implementiert, indem man eine Todo-Anwendung erstellt.

Wie planen Sie die Anmeldung in Ihrer nächsten App zu implementieren? Lassen Sie es uns im Kommentarbereich wissen.