Når man udvikler en moderne applikation, bør logning stå øverst på prioriteringslisten.

Logning giver mulighed for at visualisere din app i både udvikling og produktion, hvilket muliggør gennemsigtighed og synlighed. Med korrekt struktureret logning kan moderne applikationer blive nemmere at vedligeholde, da vi proaktivt kan identificere fejlpunkter og performance-flaskehalse i vores app.

Laravel-rammen leveres med et robust logningssystem, der håndterer alle de forhindringer, der er involveret i konfigurationen af et korrekt struktureret logningssystem ud af boksen. Dette nye logningssystem, der blev introduceret i Laravel 6.5, er kraftfuldt, og vi vil udforske det i denne artikel.

Denne artikel vil udforske det grundlæggende i Laravel-logning og hvorfor du bør bruge Laravel-logning i dit næste projekt. Vi vil diskutere struktureret logning og centraliseret logning i detaljer. Derudover vil vi lære hvordan man implementerer Laravel logning ved at bygge en Todo-applikation.

Du vil få mere ud af denne artikel, hvis du allerede har har godt styr på følgende:

Hvad er Laravel Logging?

Laravel logging handler om, hvordan Laravel håndterer logning eller automatisk problemrapportering ved hjælp af et viralt PHP-logningssystem kaldet Monolog. Men på grund af Laravels filosofi om at bruge populære eksisterende biblioteker til at implementere forskellige framework-funktioner anvender Laravel Monolog til alle logningsbehov.

Monolog er et meget fleksibelt og populært PHP-logbibliotek, som vi kan konfigurere til at sende dine logs til filer, sockets, databaser og andre webtjenester. Monolog giver en velkendt grænseflade til at skrive logs fra standard tekstfiler til avancerede loghåndteringstjenester fra tredjeparter. Laravel konfigurerer typisk Monolog til at bruge en standardkonfigurationsfil til logning.

For flere oplysninger om Monolog og dens funktioner skal du tjekke den officielle dokumentation, da det ligger uden for denne artikels rækkevidde.

Før vi dykker ned i konfigurering og implementering af Laravel-logning ved hjælp af Monolog, skal vi undersøge flere grunde til at bruge Laravel-logning og de forskellige typer.

Hvorfor bruge Laravel-logning?

Hvorfor er logning nødvendig?

Twelve-Factor App-manifestet behandler logning som en af de kritiske bekymringer for en moderne applikation, da logning er en nøgle til ydeevne og overvågning.

Logs hjælper med den detaljerede forståelse af fejl, der sker i produktionen, og hvor de stammer fra. Desuden kan logstrukturer med de rette logstrukturer vise den pågældende bruger, den handling, der forårsagede fejlen, og den mulige løsning for hurtigere fejlrettelse og vedligeholdelse.

Struktureret logning er en livredder i produktionsapplikationer ved at hjælpe med at fejlfinde fejl og løse problemer i produktionen. Derudover kan du overvåge og indsamle alle dine logmeddelelser i realtid ved hjælp af specialiserede logningsværktøjer til live-analyse og rapportering.

Af disse grunde skal du gøre struktureret logning til en topprioritet i dit næste moderne applikationsprojekt.

Lad os se på oversigten over de forskellige logføringsstile, der er tilgængelige.

Grundlæggende om Laravel-logning

Hvis du lærer det grundlæggende om logning, vil du forstå, hvordan Laravel håndterer logning, og hvordan du kan forbedre din strukturerede logningspraksis.

Lad os undersøge to væsentlige koncepter inden for logning for bedre at forstå, hvordan vi skal implementere vores logningsprocedurer.

Laravel struktureret logning

Inden for softwareudvikling er struktureret logning implementering af et forudbestemt og konsistent beskedformat for programlogfiler. Dette format gør det muligt at behandle meddelelserne som data, der kan overvåges, manipuleres og visualiseres meget bedre end det almindelige tekstformat.

Du skal implementere en struktureret logningstilgang i din moderne applikationsudvikling, fordi logfiler er væsentlige aktiver for udviklerne, når der sker noget forkert med din applikation i produktionen.

Da Laravel bruger Monolog, kan udviklere hurtigt implementere struktureret logning ved at konfigurere loggeren til at modtage bestemte typer oplysninger, gemme logfilerne i forskellige formater og sende logfilerne til forskellige loghåndteringstjenester fra tredjeparter med henblik på visualisering.

Laravel centraliseret logning

Et centraliseret logningssystem er et system, hvor logs sendes til CLM-løsninger (Centralized Log Management) fra flere kilder med henblik på nem konsolidering og visualisering. CLM er imidlertid en specialiseret log-løsning, der indsamler logmeddelelser fra forskellige kilder og konsoliderer dataene for nem behandling og visualisering.

Ud over dataindsamling forventes CLM også at understøtte analysen af logdata og en klar præsentation af dataene efter analysen.

Struktureret logning vs. grundlæggende logning

Lad os undersøge forskellen mellem struktureret logning og grundlæggende (ustruktureret) logning, og hvorfor du bør bruge struktureret logning i dit Laravel-projekt.

Grundlæggende logning

I grundlæggende logning er logfilerne gemt i et råt format med begrænsede data til at forespørge og identificere individuelle logfiler.

Når du bruger Basic logging, vil udviklere ikke kunne bruge tredjepartsanalyseværktøjer til at læse, se og analysere logfiler, medmindre de udvikler et brugerdefineret værktøj eller holder sig til et begrænset værktøj, der understøtter deres logformat.

Der er tre store grunde til at undgå at bruge Basic logging:

  1. Centraliserede loghåndteringssystemer kan ikke arbejde med dataene uden yderligere støtte.
  2. En tilpasset løsning er nødvendig for at læse og analysere dataene fra en grundlæggende logningsløsning.
  3. Det kan være en udfordring for administratorer at læse grundlæggende logningsdata, da de er rå og ustrukturerede.

Struktureret logning

Struktureret logning sparer udviklere tid ved at bruge open source-værktøjer til loganalyse fra tredjeparter, der understøtter standard logstrukturer, til at læse, se og analysere logfiler.

Logfiler er nyttige, hvis de indeholder de korrekte data, der er anført nedenfor, hvilket er det, som struktureret logning sigter mod at opnå. Vi kan bruge de data, der er indeholdt i struktureret logning, til at oprette dashboards, grafer, diagrammer og enhver anden nyttig visualisering til at bestemme applikationens tilstand.

Dette er grundlæggende eksempler på de oplysninger, som vi kan medtage i strukturerede logmeddelelser. Derudover kan du tilpasse dataene fuldstændigt til dine behov.

Her er nogle eksempler på de data, du kan indsamle med struktureret logning:

  1. Den port, der anvendes til at udføre funktionen
  2. Dato og klokkeslæt for den pågældende hændelse
  3. Kundens brugernavn eller ID
  4. En beskrivelse af hændelsen (logmeddelelse)
  5. Den protokol, der blev brugt til at udføre funktionen
  6. Placeringen af den udløste hændelse (angiv API eller kørende app)
  7. Det unikke hændelses-id
  8. Den udløste handlingstype (logniveau)

Logs skal indeholde nok data til, at det er nemt at visualisere løsningen eller årsagen til loghændelsen. Bemærk også, at du ikke bør gemme alle typer oplysninger, f.eks. passwords eller følsomme data, i logfiler.

Nu hvor vi har fået et glimt af, hvad Laravel-logning handler om, skal vi gå videre til at implementere Laravel-logning ved at bygge en applikation med logning som en førsteklasses borger.

Sådan implementeres Laravel-logning med Todo App

Nu skal vi anvende det, vi har lært indtil videre, ved at oprette et nyt Laravel-projekt og implementere Laravel-logning.

Hvis du ikke har brugt Laravel før, kan du læse hvad Laravel er, eller kigge på vores liste over fremragende Laravel-tutorials for at komme i gang.

Opsætning af Laravel

Først skal vi oprette en frisk Laravel-instans ved hjælp af nedenstående kommando. Du kan slå op i den officielle dokumentation for mere.

Åbn din konsol og naviger til det sted, hvor du gemmer dine PHP-projekter, før du kører nedenstående kommandoer. Sørg for, at Composer er installeret og konfigureret korrekt.

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

Konfigurering og seedning af databasen

Dernæst skal vi konfigurere vores database, oprette en ny Todo -model og seed 200 falske data til test.

Åbn din databaseklient, og opret en ny database. Vi gør det samme med navnet laravel_logging_app_db og udfylder derefter vores .env-fil med databasens legitimationsoplysninger:

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

Derefter kører vi følgende kommando for at oprette migreringen og Todo -modellen samtidigt:

php artisan make:model Todo -mc

Åbn den nyligt oprettede migration fundet database/migrations/xxx-create-todos-xxx.php og indsæt følgende koder:

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

Du kan sætte dine todos med Faker-data ved at lære at sætte dine databaser i Laravel ved hjælp af Faker.

Oversigt over Monolog

Med Laravel Monolog kan du streame og sende strukturerede logs til forskellige kanaler som f.eks. e-mails, Slack, filer, sockets, indbakker, databaser og forskellige webtjenester. I Laravel kan du konfigurere logning fra en enkelt konfigurationsfil, der ligger i config/logging.php.

Konfigurationsfilen leveres med foruddefinerede logdrivere at vælge imellem, og standarddriveren er en stack, der bruger single -kanalen til at logge til en laravel.log-fil, der findes i mappen storage/logs. Vi vil demonstrere struktureret logning ved at bruge et par af Laravel-logdriverne.

Laravel tilbyder en håndfuld metoder til at interagere med logs, som demonstreret generelt i TodosController.php controllerfilen om kort tid.

Skrivning af logmeddelelser i controlleren

Åbn den nyligt oprettede TodosController.php controllerfil fundet app/Http/Controllers mappe og indsæt følgende koder:


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

Inden for hver af metoderne i TodoController, tilføjede vi Log facaden med et specifikt logniveau for at definere den type fejl, vi ønsker at sende. Nedenfor er et eksempel på brug af

Log-facade i metoden 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
}

Formatering af logmeddelelser

Lad os antage, at du ikke er tilfreds med standard LineFormatter, som Laravel bruger, og som gør et godt stykke arbejde med at give læsbare og nyttige meddelelser.

I så fald kan du nemt oprette et tilpasset formatterobjekt, der passer til dit brugsscenarie, og bruge det i hele programmet.

Den officielle Monolog-dokumentation giver en komplet liste over tilgængelige formatters og kan nemt oprette en tilpasset en.

I Laravel kan du nemt indstille en af driverne til at bruge din brugerdefinerede formatter ved at tilføje den til listen som nedenfor inde i konfigurationsfilen, der ligger på 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' => 'Y-m-d',
  ]
],

Eksemplet ovenfor tilføjer en brugerdefineret MonologFormatterHtmlFormatter til daily -driveren ved hjælp af formatter – og formatter_with -nøglen i daily -kanalkonfigurationen for at ændre formatet af datoer.

Afsendelse af logs til forskellige kanaler

Ved hjælp af Monolog kan Laravel sende logs til forskellige kanaler og flere kanaler samtidig.

Lad os demonstrere, hvordan vi sender logs til vores Slack-kanal ved at følge disse enkle trin. Ændr standardlogkanalen til Slack, og tilføj Slack Webhook URL i din .env-fil.

LOG_CHANNEL=slack
LOG_SLACK_WEBBHOOK_URL= Slack_webhook_url_here

Test derefter din konfiguration ved at logge en meddelelse i din applikation ved hjælp af Log -facaden som vist nedenfor:

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

Du kan åbne din Slack-kanal for at kontrollere, om fejlen er udskrevet i den ønskede kanal, som du har angivet, da du genererede webhook-URL’en.

Opsummering

Logning er lige så vigtig som enhver anden faktor i din applikation, hvis ikke vigtigere. Derfor foreslås det af Twelve-Factor App-manifestet som en af de mest kritiske bekymringer for enhver moderne applikation.

Med effektiv logning kan du nemt læse, se og visualisere fejl og defekter, der opstår i din produktionsklare applikation. Derfor er det vigtigt, at du implementerer struktureret logning i din applikation lige fra starten af projektet.

I denne artikel har vi udforsket Laravel logging, og hvorfor du bør bruge det i dit næste projekt. Vi diskuterede både struktureret logning og centraliseret logning i detaljer. Derudover lærte vi, hvordan man implementerer Laravel-logning ved at bygge en Todo-applikation.

Hvordan har du planer om at implementere logning i din næste app? Lad os vide det i kommentarfeltet.

Solomon Eseme

I am a Software Engineer and Content Creator who is geared toward building high-performing and innovative products following best practices and industry standards. I also love writing about it at Masteringbackend.com. Follow me on Twitter, LinkedIn, and About Me