Te confrunți cu provocări în depanarea codului? Cauți modalități eficiente de logare care să simplifice acest proces? Continuă să citești pentru a descoperi soluții utile.
Dezvoltarea software-ului presupune parcurgerea mai multor etape: definirea cerințelor, analiză, scriere cod, testare și mentenanță. Dintre acestea, faza de codare/dezvoltare este cea mai consumatoare de timp și resurse. Inginerii software se confruntă cu diverse tipuri de erori, inclusiv de sintaxă, logică și runtime. Erorile de sintaxă sunt semnalate în timpul compilării, fiind cauzate de nerespectarea regulilor unui anumit limbaj de programare.
În schimb, erorile logice și de rulare nu sunt detectate automat de mediile de dezvoltare integrate (IDE) și pot fi dificil de identificat și corectat. Procesul de eliminare a erorilor este adesea anevoios și necesită o depanare intensivă.
Depanarea reprezintă procesul prin care se încearcă înțelegerea cauzelor pentru care un cod nu funcționează conform așteptărilor. Identificarea precisă a erorii și a liniilor de cod afectate facilitează rezolvarea problemei. În acest context, logarea joacă un rol crucial în procesul de depanare.
Ce reprezintă logarea?
Logarea este o tehnică prin care se înregistrează mesaje în timpul execuției unui program. Este important să se înregistreze doar acele mesaje care pot fi utile în timpul depanării. Stabilirea momentelor optime pentru adăugarea instrucțiunilor de logare în cod este, de asemenea, esențială. Diferențierea instrucțiunilor de logare este la fel de importantă. Există diferite niveluri de logare, cum ar fi informații, avertismente, erori, depanare și detalii. Declarațiile de eroare și avertismente sunt utilizate pentru a gestiona excepțiile.
Datele returnate de funcții, rezultatele prelucrării matricelor, datele obținute din API-uri sunt câteva exemple de date care pot fi înregistrate cu ajutorul instrucțiunilor de tip info. Jurnalele de depanare și cele detaliate oferă descrieri aprofundate ale erorilor.
Logarea de depanare include informații despre urmărirea stivei, parametrii de intrare și ieșire etc. Nivelul „verbose” oferă o listă detaliată a evenimentelor, dar nu la fel de aprofundată ca jurnalul de depanare. Jurnalele sunt înregistrate în consolă, fișiere sau fluxul de ieșire. Pentru o logare structurată și formatată, se pot utiliza instrumente dedicate de gestionare a jurnalelor.
Logarea în Node.js
Node.js este un mediu de execuție JavaScript. Aplicațiile Node.js sunt asincrone și non-blocante, fiind utilizate în sisteme în timp real și aplicații care procesează volume mari de date. Pentru a aprofunda cunoștințele despre Node.js, se recomandă consultarea tutorialelor și a documentației oficiale. Logarea este crucială pentru optimizarea performanței, depanarea și urmărirea erorilor. În Node.js, logarea se poate realiza cu funcția încorporată console.log
. Funcțiile de depanare sunt interconectate cu diverse pachete și pot fi utilizate eficient.
Middleware este utilizat pentru gestionarea cererilor și a răspunsurilor. Acesta poate fi o aplicație sau orice alt framework JavaScript. Logarea în middleware se realizează prin intermediul aplicațiilor și routerelor. Pentru a utiliza orice logger Node.js, este necesară instalarea pachetelor corespunzătoare cu ajutorul comenzilor npm install
sau yarn install
.
npm
reprezintă „Node Package Manager”, iar YARN
înseamnă „Yet Another Resource Negotiator”. YARN este preferat, deoarece este mai rapid și instalează pachetele în paralel.
Mai jos sunt prezentate câteva dintre cele mai eficiente biblioteci de logare pentru Node.js:
Pino
Pino este o bibliotecă de logare foarte apreciată pentru aplicațiile Node.js. Este open source, extrem de rapidă și înregistrează declarațiile într-un format JSON ușor de citit. Nivelurile de logare oferite de Pino includ: mesaje de depanare, avertismente, erori și informații. O instanță a loggerului Pino poate fi importată în proiect, iar instrucțiunile console.log
sunt înlocuite cu instrucțiuni logger.info
.
Pentru a instala Pino, se utilizează următoarea comandă:
$ npm install pino
Jurnalele generate sunt detaliate și în format JSON, incluzând numărul liniei de jurnal, tipul jurnalului, ora la care a fost înregistrat etc. Pino generează o supraîncărcare minimă în cadrul unei aplicații și oferă flexibilitate în procesarea jurnalelor.
Pino poate fi integrat cu diverse framework-uri web precum Hapi, Restify, Express etc. Jurnalele generate de Pino pot fi salvate în fișiere. Utilizează fire de execuție pentru funcționare și este compatibil cu TypeScript.
Winston
Winston oferă suport pentru logare în diverse framework-uri web, punând accent pe flexibilitate și extensibilitate. Acceptă multiple tipuri de transport și permite stocarea jurnalelor în diverse locații. Transporturile reprezintă destinațiile unde sunt stocate mesajele de jurnal.
Pe lângă transporturile încorporate, cum ar fi Http, Console, File și Stream, Winston acceptă și altele, cum ar fi Cloud Watch și MongoDB. Logarea se realizează pe diferite niveluri și în diverse formate. Nivelurile de logare indică gravitatea problemei.
Nivelurile de logare disponibile sunt prezentate mai jos:
{ error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6 }
Formatul jurnalului de ieșire poate fi personalizat, filtrat și combinat. Jurnalele includ informații despre marcajul temporal, etichetele asociate jurnalului, milisecundele scurse de la jurnalul anterior etc.
Winston gestionează și excepțiile, precum și promisiunile neprinse. Oferă funcții suplimentare, cum ar fi depunerea interogărilor, jurnale de streaming etc. Pentru a utiliza Winston, este necesară instalarea. Ulterior, este creat un obiect de configurare Winston împreună cu transportul pentru stocarea jurnalului. Un obiect logger este creat utilizând funcția createLogger()
, iar mesajul jurnal îi este transmis.
Node-Bunyan
Bunyan este utilizat pentru logarea rapidă în Node.js, în format JSON. Oferă, de asemenea, un instrument CLI (Command Line Interface) pentru vizualizarea jurnalelor. Este ușor și suportă diverse medii de execuție, precum Node.js, Browserify, WebPack și NW.js. Formatul JSON al jurnalelor este îmbunătățit cu ajutorul funcției de „pretty print”. Jurnalele sunt clasificate pe diverse niveluri: fatal, eroare, avertisment, informații, depanare și urmărire. Fiecare nivel are o valoare numerică asociată.
Toate nivelurile care depășesc nivelul setat pentru instanță sunt înregistrate. Fluxul Bunyan reprezintă locația unde sunt înregistrate ieșirile. Subcomponentele unei aplicații pot fi înregistrate prin funcția log.child()
. Toți loggerii „copil” sunt conectați la o aplicație „părinte”. Tipul fluxului poate fi un fișier, un fișier rotativ, date brute etc. Exemplul de cod pentru definirea unui flux este prezentat mai jos:
var bunyan = require('bunyan'); var log = bunyan.createLogger({ name: "foo", streams: [ { stream: process.stderr, level: "debug" }, ... ] });
Bunyan acceptă, de asemenea, logarea DTrace. Sondele implicate în logarea DTrace includ log-trace
, log-warn
, log-error
, log-info
, log-debug
și log-fatal
. Bunyan utilizează serializatoare pentru a genera jurnale în format JSON. Funcțiile de serializare nu generează excepții și au un caracter defensiv.
Loglevel
Loglevel este utilizat pentru logarea în aplicațiile JavaScript. Este considerată una dintre cele mai bune biblioteci de logare Node.js datorită simplității și ușurinței în utilizare. Înregistrează la nivelul specificat și folosește un singur fișier fără dependențe. Nivelul implicit de jurnal este „avertisment”. Ieșirile jurnalului sunt formatate adecvat, incluzând numerele de linie. Câteva metode utilizate pentru logare includ trace
, debug
, warn
, error
și info
.
Loglevel este rezistent la erori în orice mediu. getLogger()
este metoda folosită pentru a obține obiectul logger. Poate fi combinat cu alte plugin-uri pentru a-i extinde funcționalitățile. Câteva dintre plugin-uri includ loglevel-plugin-prefix
, loglevel-plugin-remote
, ServerSend
și DEBUG
. Pluginul pentru adăugarea mesajelor cu prefix la logare este prezentat mai jos:
var originalFactory = log.methodFactory; log.methodFactory = function (methodName, logLevel, loggerName) { var rawMethod = originalFactory(methodName, logLevel, loggerName); return function (message) { rawMethod("Newsflash: " + message); }; }; log.setLevel(log.getLevel()); // Be sure to call setLevel method in order to apply plugin
Compilările sunt executate folosind comanda npm run dist
, iar testele se execută cu npm test
. Nivelul de jurnal acceptă pachetele Webjar, Bower și Atmosphere. O nouă versiune Loglevel este lansată ori de câte ori sunt adăugate noi funcționalități.
Signale
Signale include 19 loggere pentru aplicații JavaScript. Oferă suport pentru TypeScript și pentru logare în jurnal. Include cronometre care ajută la înregistrarea marcajului de timp, a datelor și a numelui fișierului. Pe lângă cele 19 loggere predefinite (await, complete, fatal, fav, info etc.), se pot crea și loggere personalizate.
Loggerele personalizate sunt create prin definirea unui obiect JSON și a câmpurilor care conțin datele necesare logării. Se pot crea și loggere interactive. Atunci când un logger interactiv este setat la „adevărat”, noile valori de la loggerii interactivi le înlocuiesc pe cele vechi.
Un avantaj major al Signale este capacitatea de a filtra informațiile confidențiale. Mai multe informații sensibile sunt stocate într-o matrice. addSecrets()
și clearSecrets()
sunt funcțiile utilizate pentru a adăuga și elimina secrete din matrice. Boostnote, Docz, Shower, Taskbook și Vant utilizează Signale pentru logare. Sintaxa pentru apelarea API-urilor din Signale este următoarea:
signale.<logger>(message[,message]|messageObj|errorObj)
Numărul de descărcări Signale depășește 1 milion la momentul scrierii acestui articol.
Tracer
Tracer este utilizat pentru a genera mesaje detaliate de logare. Acestea includ marcaje temporale, nume de fișiere, numere de linii și nume de metode. Pentru a personaliza formatul jurnalului de logare, se pot instala pachete de ajutor. Aceste pachete se instalează cu ajutorul următoarei comenzi:
npm install -dev tracer
Tracer acceptă transportul fișierelor, fluxului și MongoDB. Oferă suport pentru consolă colorată și condiții de filtrare în logare. Pentru a începe utilizarea Tracer, este necesară instalarea prin comanda npm install
. Apoi, se creează un obiect logger și se alege tipul de consolă. Ulterior, se specifică diferitele niveluri sau tipuri de jurnal care vor fi utilizate pentru logare.
Filtre personalizate pot fi create prin definirea funcțiilor sincrone cu logica necesară. Pentru logarea în sistem, se pot utiliza micro-șabloane, precum tinytim
.
Cabin.js
Cabin este utilizat pentru logarea atât pe server, cât și pe partea client a aplicațiilor Node.js. Este preferat în situațiile în care este necesară mascarea informațiilor sensibile și critice, precum numerele de card, anteturile BasicAuth, cheile de securitate, parolele, token-urile CSRF și numerele de cont bancar. Fragmentul de cod de mai jos ilustrează modul de logare cu Cabin.js.
const Cabin = require('cabin'); const cabin = new Cabin(); cabin.info('hello world'); cabin.error(new Error('oops!'));
Cabin include peste 1600 de nume de câmpuri. De asemenea, respectă principiul „Bring Your Own Logger” (BYOL), fiind compatibil cu diverse alte biblioteci de logare precum Axe, Pino, Bunyan, Winston etc. Datorită fluxului automat și bufferelor integrate, Cabin reduce costurile de stocare. Este compatibil cu multiple platforme și facilitează depanarea.
Logarea pe server presupune utilizarea middleware pentru rutare și pentru înregistrarea automată a ieșirilor. Logarea la nivelul browserului necesită solicitări și scripturi XHR. Cabin folosește Axe pentru a afișa metadate, adică date despre date, urme de stivă și alte erori. Variabilele booleene SHOW_STACK
și SHOW_META
sunt setate la „adevărat” sau „fals” pentru a afișa sau ascunde urmele și metadatele stivei.
Npmlog
Npmlog este un logger de bază, utilizat de npm. Metodele de logare includ level
, record
, maxRecordSize
, prefixStyle
, heading
și stream
. Oferă suport pentru logare colorată. Diversele niveluri de logare sunt: silly
, verbose
, info
, warn
, http
și error
. Un exemplu de cod pentru utilizarea jurnalului npm este prezentat mai jos.
var log = require('npmlog') // additional stuff ---------------------------+ // message ----------+ | // prefix ----+ | | // level -+ | | | // v v v v log.info('fyi', 'I have a kitty cat: %j', myKittyCat)
Toate mesajele sunt suprimate dacă „Infinity” este specificat ca nivel de jurnal. Dacă „-Infinity” este specificat ca nivel de jurnal, opțiunea de a vedea mesajele jurnalului trebuie activată pentru a putea vizualiza jurnalele.
Evenimentele și obiectele mesaj sunt utilizate pentru logare. Mesajele cu prefix sunt emise atunci când sunt utilizate evenimente de prefix. Obiectele de stil sunt folosite pentru formatarea jurnalelor, permițând adăugarea de culori textului și fundalului, precum și aplicarea stilurilor de font, cum ar fi bold, italic, subliniat etc. Câteva pachete de jurnal npm includ brolog
, npmlogger
, npmdate log
etc.
Roarr
Roarr este un logger pentru Node.js care nu necesită inițializare și generează date structurate. Oferă un instrument CLI și variabile de mediu. Este compatibil cu browserul și poate fi integrat cu Fastify, Elastic Search etc. Distinge între codul aplicației și codul dependențelor. Fiecare mesaj de jurnal conține un context, un mesaj, o secvență, o marcă de timp și o versiune. Nivelurile de jurnal includ: trace
, debug
, info
, warn
, error
și fatal
. Un exemplu de cod care demonstrează logarea cu Roarr este următorul:
import { ROARR, } from 'roarr'; ROARR.write = (message) => { console.log(JSON.parse(message)); };
De asemenea, se poate realiza serializarea erorilor, adică instanța erorii poate fi înregistrată împreună cu contextul obiectului. Câteva dintre variabilele de mediu specifice pentru Node.js și Roarr sunt ROARR_LOG
și ROARR_STREAM
. Funcția „adoptă” este utilizată în Node.js pentru a transmite proprietățile contextului către diferite niveluri. Funcțiile „copil” pot fi utilizate împreună cu middleware în timpul logării.
Concluzie
Logarea este esențială pentru monitorizarea diferitelor activități și evenimente în timpul execuției unui program. Jurnalele joacă un rol crucial în depanarea codului, contribuind totodată la îmbunătățirea lizibilității acestuia. Node.js este un mediu de execuție JavaScript open-source. Câteva dintre cele mai performante biblioteci de logare pentru Node.js sunt Pino, Winston, Bunyan, Signale, Tracer, Npmlog etc. Fiecare logger are caracteristici specifice, cum ar fi profilarea, filtrarea, streamingul și transportul.
Unele biblioteci de logare oferă suport pentru console colorate, în timp ce altele sunt mai potrivite pentru gestionarea informațiilor confidențiale. Jurnalele detaliate și formatate ajută dezvoltatorii să identifice și să corecteze erorile din cod. Formatul JSON este adesea preferat pentru logare, deoarece datele sunt înregistrate sub formă de perechi cheie-valoare, ceea ce facilitează utilizarea lor.
Loggerele pot fi integrate și cu alte aplicații și sunt compatibile cu mai multe browsere. Este recomandat să analizați cu atenție cerințele aplicației pe care o dezvoltați înainte de a alege o anumită bibliotecă de logare.
Poți consulta și ghidurile noastre despre instalarea Node.js și NPM pe Windows și macOS.