Laravel Logging: Tot ce trebuie să știți

Publicat: 2022-08-19

Când dezvoltați o aplicație modernă, înregistrarea ar trebui să fie în partea de sus a listei de priorități.

Înregistrarea oferă o modalitate de a vizualiza aplicația dvs. atât în ​​dezvoltare, cât și în producție, permițând transparență și vizibilitate. Cu o înregistrare structurată corespunzător, aplicațiile moderne pot deveni mai ușor de întreținut, deoarece putem identifica în mod proactiv punctele de eșec și blocajele de performanță în aplicația noastră.

Cadrul Laravel vine cu un sistem robust de logare care se ocupă de toate obstacolele implicate în configurarea unui sistem de logare structurat corespunzător. Acest nou sistem de înregistrare introdus în Laravel 6.5 este puternic și îl vom explora în acest articol.

Acest articol va explora elementele de bază ale înregistrării Laravel și de ce ar trebui să utilizați înregistrarea Laravel în următorul proiect. Vom discuta în detaliu despre logare structurată și logare centralizată. În plus, vom învăța cum să implementăm înregistrarea Laravel prin construirea unei aplicații Todo.

Veți beneficia mai mult de acest articol dacă aveți deja următoarele sub centură:

  • Cunoștințe bune de dezvoltare web
  • Înțelegerea de bază a lui Laravel
  • Crearea de aplicații cu Laravel

Ce este Laravel Logging?

Înregistrarea Laravel se referă la modul în care Laravel gestionează înregistrarea sau raportarea automată a problemelor, folosind un sistem de înregistrare PHP viral numit Monolog. Cu toate acestea, datorită filozofiei lui Laravel de a folosi biblioteci populare existente pentru a implementa diferite caracteristici ale cadrului, Laravel folosește Monolog pentru toate nevoile sale de logare.

Monolog este o bibliotecă de logare PHP foarte flexibilă și populară pe care o putem configura pentru a trimite jurnalele dvs. către fișiere, socket-uri, baze de date și alte servicii web. Monolog oferă o interfață familiară pentru scrierea jurnalelor din fișiere text standard către servicii avansate de gestionare a jurnalelor de la terți. Laravel setează de obicei Monolog pentru a utiliza un fișier de configurare standard de înregistrare.

Pentru mai multe informații despre Monolog și caracteristicile sale, consultați documentația oficială, deoarece aceasta depășește scopul acestui articol.

Înainte de a ne aprofunda în configurarea și implementarea înregistrării Laravel folosind Monolog, haideți să explorăm mai multe motive pentru a utiliza înregistrarea Laravel și diferitele tipuri.

De ce să folosiți Laravel Logging?

De ce este necesară înregistrarea în jurnal?

Manifestul aplicației Twelve-Factor tratează înregistrarea ca una dintre preocupările critice ale unei aplicații moderne, deoarece înregistrarea în jurnal este o cheie pentru performanță și monitorizare.

Jurnalele ajută la înțelegerea detaliată a erorilor care apar în producție și de unde au provenit. În plus, cu structuri de jurnal adecvate, poate arăta utilizatorul anume, acțiunea care a cauzat eroarea și soluția posibilă pentru remedierea și întreținerea mai rapidă a erorilor.

Înregistrarea structurată este o salvare în aplicațiile de producție, ajutând la depanarea defectelor și la rezolvarea problemelor din producție. În plus, puteți monitoriza și colecta toate mesajele de jurnal în timp real, folosind instrumente specializate de înregistrare pentru analiză și raportare în timp real.

Din aceste motive, trebuie să faceți din jurnalizarea structurată o prioritate de top în următorul proiect de aplicație modernă.

Să ne uităm la prezentarea de ansamblu a diferitelor stiluri de înregistrare disponibile.

Bazele Logging-ului Laravel

Învățarea elementelor de bază ale jurnalizării vă va ajuta să înțelegeți cum gestionează Laravel înregistrarea în jurnal și cum vă puteți îmbunătăți practicile de înregistrare structurată.

Să examinăm două concepte esențiale în înregistrare pentru a înțelege mai bine cum să implementăm procedurile noastre de înregistrare.

Logging structurat Laravel

În dezvoltarea de software, jurnalul structurat implementează un format de mesaj predeterminat și consistent pentru jurnalele de aplicații. Acest format permite ca mesajele să fie tratate ca date care pot fi monitorizate, manipulate și vizualizate mult mai bine decât formatul de text obișnuit.

Trebuie să implementați o abordare de jurnalizare structurată în dezvoltarea aplicației dvs. moderne, deoarece fișierele jurnal sunt activele esențiale pentru dezvoltatori atunci când se întâmplă ceva greșit cu aplicația dvs. în producție.

Deoarece Laravel folosește Monolog, dezvoltatorii pot implementa rapid înregistrarea structurată prin configurarea logger-ului pentru a primi anumite tipuri de informații, stocarea fișierelor jurnal în diferite formate și trimiterea jurnalelor către diverse servicii terțe de gestionare a jurnalelor pentru vizualizare.

Înregistrare centralizată Laravel

Un sistem de înregistrare centralizat este în cazul în care jurnalele sunt trimise către soluțiile de gestionare centralizată a jurnalelor (CLM) din mai multe surse pentru o consolidare și vizualizare ușoară. Cu toate acestea, CLM este o soluție de înregistrare specializată care colectează mesaje de jurnal din diferite surse și consolidează datele pentru o procesare și vizualizare ușoară.

Pe lângă colectarea datelor, se așteaptă, de asemenea, că CLM va sprijini analiza datelor de jurnal și prezentarea clară a datelor după analiză.

Înregistrare structurată vs înregistrare de bază

Să examinăm diferența dintre înregistrarea structurată și înregistrarea de bază (nestructurată) și de ce ar trebui să utilizați înregistrarea structurată în proiectul dvs. Laravel.

Înregistrare de bază

În înregistrarea de bază, fișierele jurnal sunt stocate într-un format brut cu date limitate pentru a interoga și a identifica jurnalele individuale.

Când folosesc jurnalul de bază, dezvoltatorii nu vor putea folosi instrumente analitice terțe pentru a citi, vizualiza și analiza jurnalele decât dacă dezvoltă un instrument personalizat sau rămân cu un instrument limitat care acceptă formatul lor de jurnal.

Există trei motive mari pentru a evita utilizarea jurnalului de bază:

  1. Sistemele centralizate de gestionare a jurnalelor nu pot funcționa cu datele fără suport suplimentar.
  2. Este necesară o soluție personalizată pentru a citi și analiza datele unei soluții de bază de logare.
  3. Poate fi o provocare pentru administratori să citească datele de bază de jurnal, deoarece sunt brute și nestructurate.

Înregistrare structurată

Jurnalul structurat economisește timp dezvoltatorilor prin utilizarea instrumentelor de analiză a jurnalelor terțe cu sursă deschisă, care acceptă structura standard de jurnal pentru a citi, vizualiza și analiza jurnalele.

Jurnalele sunt utile dacă conțin datele corecte enumerate mai jos, ceea ce urmărește să obțină înregistrarea structurată. Putem folosi datele incluse în jurnalul structurat pentru a crea tablouri de bord, grafice, diagrame și orice altă vizualizare utilă pentru a determina starea de sănătate a aplicației.

Acestea sunt exemple de bază ale informațiilor pe care le putem include în mesajele de jurnal structurate. În plus, puteți personaliza complet datele pentru a se potrivi nevoilor dvs.

Iată câteva exemple de date pe care le puteți colecta cu înregistrarea structurată:

  1. Portul folosit pentru a executa funcția
  2. Data și ora la care a avut loc evenimentul
  3. Numele de utilizator sau ID-ul clientului
  4. O descriere a evenimentului (mesaj de jurnal)
  5. Protocolul utilizat pentru a executa funcția
  6. Locația evenimentului declanșat (indicați API-ul sau aplicația care rulează)
  7. ID-ul unic al evenimentului
  8. Tipul de acțiune declanșată (nivel de jurnal)

Jurnalele ar trebui să conțină suficiente date pentru a vizualiza cu ușurință soluția sau motivul evenimentului de jurnal. De asemenea, rețineți că nu ar trebui să stocați toate tipurile de informații, cum ar fi parolele sau datele sensibile în jurnale.

Acum că am întrezărit despre ce este înregistrarea Laravel, să trecem la implementarea înregistrării Laravel prin construirea unei aplicații cu logare ca cetățean de primă clasă.

Cum se implementează Logging Laravel cu aplicația Todo

Acum vom aplica ceea ce am învățat până acum prin crearea unui nou proiect Laravel și implementarea înregistrării Laravel.

Dacă nu ați folosit Laravel până acum, puteți citi ce este Laravel sau puteți arunca o privire la lista noastră de tutoriale excelente Laravel pentru a începe.

Se instalează Laravel

Mai întâi, vom crea o nouă instanță Laravel folosind comanda de mai jos. Puteți căuta documentația oficială pentru mai multe.

Deschideți consola și navigați până unde vă stocați proiectele PHP înainte de a rula comenzile de mai jos. Asigurați-vă că aveți Composer instalat și configurat corect.

 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

Configurarea și completarea bazei de date

În continuare, ne vom configura baza de date, vom crea un nou model Todo și vom genera 200 de date false pentru testare.

Deschideți clientul bazei de date și creați o nouă bază de date. Vom face același lucru cu numele laravel_logging_app_db și apoi vom completa fișierul nostru .env cu acreditările bazei de date:

 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

Apoi, vom rula următoarea comandă pentru a crea migrarea și modelul Todo simultan:

 php artisan make:model Todo -mc

Deschideți noua bază de date de migrare găsită/migrations/xxx-create-todos-xxx.php și inserați următoarele coduri:

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

Puteți să vă însămânțați toate cu date falsificate, învățând să vă însemeți bazele de date în Laravel folosind Faker.

Te lupți cu timpii de nefuncționare și problemele WordPress? Kinsta este soluția de găzduire concepută pentru a vă economisi timp! Verificați caracteristicile noastre

Prezentare generală a Monolog

Cu Laravel Monolog, puteți transmite și trimite jurnalele structurate către diferite canale, cum ar fi e-mailuri, Slack, fișiere, socket-uri, căsuțe de intrare, baze de date și diverse servicii web. În Laravel, puteți configura înregistrarea dintr-un singur fișier de configurare situat în config/logging.php .

Fișierul de configurare vine cu drivere de jurnal predefinite din care să aleagă, iar driverul implicit este o stack care utilizează un single canal pentru a se conecta la un fișier laravel.log găsit în folderul de stocare/jurnal . Vom demonstra înregistrarea structurată utilizând câteva drivere de jurnal Laravel.

Laravel oferă o mână de metode de a interacționa cu jurnalele, așa cum se demonstrează în general în fișierul controler TodosController.php în scurt timp.

Scrierea mesajelor de jurnal în controler

Deschideți fișierul controler TodosController.php nou creat, găsit app/Http/Controllers și inserați următoarele coduri:

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

În fiecare dintre metodele din TodoController , am adăugat fațada Log cu un anumit nivel de jurnal pentru a defini tipul de eroare pe care dorim să o trimitem. Mai jos este un exemplu de utilizare a

Fațada de jurnal în metoda 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 }

Formatarea mesajelor din jurnal

Să presupunem că nu vă simțiți confortabil cu LineFormatter -ul implicit utilizat de Laravel, care face o treabă grozavă de a furniza mesaje lizibile și utile.

În acest caz, puteți roti cu ușurință un obiect de formatare personalizat pentru a se potrivi cazului dvs. de utilizare și îl puteți utiliza în întreaga aplicație.

Documentația oficială Monolog oferă o listă completă de formatatoare disponibile și poate crea cu ușurință una personalizată.

În Laravel, puteți seta cu ușurință oricare dintre drivere să utilizeze formatatorul personalizat, adăugându-l la lista ca mai jos în fișierul de configurare situat la 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', ] ],

Exemplul de mai sus adaugă un MonologFormatterHtmlFormatter personalizat la driverul daily folosind cheia formatter și formatter_with în configurația daily a canalului pentru a schimba formatul de date.

Trimiterea jurnalelor către diferite canale

Cu ajutorul lui Monolog, Laravel poate trimite jurnalele către diferite canale și mai multe canale simultan.

Să demonstrăm cum să trimitem jurnalele către canalul nostru Slack urmând acești pași simpli. Schimbați canalul de jurnal implicit la Slack și adăugați adresa URL a Slack Webhook în fișierul dvs. .env .

 LOG_CHANNEL=slack LOG_SLACK_WEBBHOOK_URL= Slack_webhook_url_here

Apoi, testați configurația dvs. înregistrând un mesaj în aplicația dvs. utilizând fațada Log ca cea prezentată mai jos:

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

Vă puteți deschide canalul Slack pentru a verifica eroarea tipărită în canalul dorit pe care l-ați specificat la generarea URL-ului Webhook.

rezumat

Logarea este la fel de importantă ca orice alt factor al aplicației dvs., dacă nu mai mult. De aceea este sugerat de manifestul Twelve-Factor App ca fiind una dintre cele mai critice preocupări ale oricărei aplicații moderne.

Cu o înregistrare eficientă, puteți citi, vizualiza și vizualiza cu ușurință erorile și defectele care apar în aplicația dumneavoastră pregătită pentru producție. În acest scop, este important să implementați conectarea structurată în aplicația dvs. chiar de la începutul proiectului.

În acest articol, am explorat înregistrarea Laravel și de ce ar trebui să o utilizați în următorul proiect. Am discutat în detaliu atât jurnalizarea structurată, cât și înregistrarea centralizată. În plus, am învățat cum să implementăm înregistrarea Laravel prin construirea unei aplicații Todo.

Cum plănuiți să implementați conectarea la următoarea aplicație? Anunțați-ne în secțiunea de comentarii.