Să fim sinceri, dezvoltatorii fac mai mult depanare decât scriu codul real. Există cazuri în care trebuie să depanați o problemă a aplicației Node.js, jurnalele sunt salvatorii. Acestea oferă informații despre gravitatea problemei, precum și informații despre cauza principală a acesteia. Astfel, bunele practici de logare sunt cruciale pentru monitorizarea serverelor dvs. Node.js, urmărirea erorilor, efectuarea diferitelor analize și descoperirea oportunităților de optimizare. Acest articol va sublinia cele mai bune practici de înregistrare în jurnal de urmat atunci când scrieți o aplicație Node.js.

1. Alegerea bibliotecii corecte

Dezvoltatorii Node.js tind să se bazeze pe metodele consolei runtime (cum ar fi console.log()) pentru a înregistra evenimente și pentru a oferi un API familiar similar cu mecanismul consolei Javascript din browsere. console.log() are utilizările sale, dar nu este suficient să-l folosești ca soluție de logare într-o aplicație de producție. Oferă metode precum console.warn(), console.error(), console.debug(), dar acestea sunt simple funcții care imprimă rezultatul standard și nu definesc severitatea jurnalului.

Caracteristicile unei biblioteci bune de logare

O bibliotecă bună de jurnalizare oferă caracteristici robuste care facilitează formatarea și distribuirea jurnalelor de către dezvoltatori. De exemplu, un cadru obișnuit de înregistrare va oferi opțiuni pentru unde să iasă datele de jurnal. Un dezvoltator îl poate configura să scoată jurnalele în terminal sau să le salveze într-un sistem de fișiere sau bază de date sau chiar să le trimită prin HTTP în cazul în care există un serviciu separat de gestionare a jurnalelor.

Preocupări majore în alegerea unei biblioteci potrivite

Înregistrare:

Formatare: o bibliotecă ar trebui să ofere opțiuni adecvate de formatare a jurnalelor care să vă ajute să diferențiați diferitele niveluri de înregistrare, să personalizați culorile și prioritățile nivelurilor în funcție de nevoi și comoditate.

Stocare: ar trebui să ofere și modalități de a configura locul în care un dezvoltator poate salva jurnalele, așa cum am vorbit mai devreme

Performanță: deoarece loggerul va fi utilizat în întreaga bază de cod, poate afecta performanța de rulare a aplicației dvs., de aceea este esențial să analizați și să comparați caracteristicile de performanță înainte de a alege o bibliotecă.

una dintre astfel de biblioteci populare este Winston, despre care vom vorbi în acest blog.

2. Utilizați nivelurile de jurnal corecte

Înainte de a continua cu înțelegerea nivelurilor de jurnal, permiteți-ne să instalăm mai întâi biblioteca, astfel încât să puteți încerca comenzi și coduri pe măsură ce mergem.

Instalați biblioteca:

npm install winston

Indiferent de sistemul de denumire folosit de diferite biblioteci pentru a desemna nivelurile de jurnal, conceptul rămâne în mare parte același. Iată cele mai frecvent utilizate niveluri de jurnal, în ordinea descrescătoare a severității:

FATAL: aceasta reprezintă o situație catastrofală, în care aplicația dvs. nu se poate recupera fără intervenție manuală.

EROARE: reprezintă o eroare în sistem care poate opri o anumită operațiune, dar nu și sistemul în ansamblu. Acesta este de obicei folosit pentru a înregistra erorile returnate de un API terță parte.

AVERTISMENT: indică condiții de rulare care sunt neobișnuite, dar care nu afectează în niciun fel sistemul de rulare.

INFO: aceasta reprezintă mesaje pur informative. Poate fi folosit pentru a înregistra evenimente determinate de utilizator sau specifice aplicației. O utilizare comună a acestui nivel este de a înregistra serviciul de pornire sau oprire.

DEBUG: folosit pentru a reprezenta informații de diagnosticare care pot fi necesare pentru depanare.

TRACE: captează fiecare detaliu posibil despre comportamentul unei aplicații în timpul dezvoltării.

Biblioteca Winston, în special, utilizează următoarele niveluri de jurnal în mod implicit - eroarea fiind cea mai gravă și cea mai prostească fiind cea mai mică:

{
  error: 0,
  warn: 1,
  info: 2,
  http: 3,
  verbose: 4,
  debug: 5,
  silly: 6
}

Dacă nu sunteți confortabil cu denumirea implicită, puteți modifica acest lucru prin inițializarea loggerului personalizat conform nevoilor dvs. în Winston.

const { createLogger, format, transports } = require('winston');
const logLevels = {
  fatal: 0,
  error: 1,
  warn: 2,
  info: 3,
  debug: 4,
  trace: 5,
};
const logger = createLogger({
  levels: logLevels,
  transports: [new transports.Console()],
});

Când doriți să înregistrați un mesaj, puteți înregistra nivelul dorit direct pe loggerul personalizat

logger.info('System Started');
logger.fatal('Fatal error occuered');

3. Logging structural

La scrierea mesajelor de jurnal, prioritatea ar trebui să fie de a face mesajele ușor de citit atât pentru mașini, cât și pentru oameni. Unul dintre obiectivele principale ale jurnalului este de a permite depanarea post-mortem, care implică citirea intrărilor din jurnal și reconstruirea pașilor care au condus la un eveniment în sistem.

Astfel, mesajele descriptive care pot fi citite de om și ușor de înțeles vor ajuta dezvoltatorii și administratorii de sistem. De asemenea, este important să utilizați un format structurat care este ușor de analizat de către mașini.

Una dintre cele mai bune practici este utilizarea JSON pentru înregistrare, deoarece este ușor de citit de oameni, poate fi analizat de mașini și poate fi ușor convertit în alte formate. Când vă conectați la JSON, este necesar să folosiți o schemă standard, astfel încât semantica fiecărui câmp să fie clar definită. De asemenea, este ușor să găsiți ceea ce căutați atunci când analizați intrările de jurnal.

Winston scoate implicit un șir JSON cu două câmpuri: mesaj și nivel. Mesajul conține text care a fost înregistrat și nivelul indică nivelul de jurnal. putem personaliza acest lucru folosind winston.format. de exemplu, puteți adăuga timestamp combinând timestamp și JSON.

const { createLogger, format, transports } = require('winston');
const logger = createLogger({
  format: format.combine(format.timestamp(), format.json()),
  transports: [new transports.Console({})],
});

4. Scrieți mesaje descriptive

Mesajul ar trebui să descrie clar evenimentul care a avut loc în acel moment. Fiecare mesaj ar trebui să fie unic pentru situație, astfel încât dezvoltatorul sau administratorul de sistem să poată diferenția și urmări cu ușurință erorile.

Unul dintre exemplele proaste ale mesajului de jurnal este:

Error occured!!

Jurnalul de mai sus îi spune utilizatorului că a apărut o eroare, dar nu există detalii despre tipul de eroare care a apărut sau locul în care a apărut. Un mesaj mai descriptiv arată astfel:

"PUT" request to "<https://example.com/api>" failed. Response code: "503", response message: "Internal Server Error!". Retrying after "60" seconds.

Din acest mesaj, știm că cererea către serverul „example.com” a eșuat. Motivul probabil este că serverul terță parte ar putea fi oprit din motive necunoscute.

5. Evitați înregistrarea datelor sensibile

Indiferent de tipul de aplicație la care lucrați, este întotdeauna important să evitați înregistrarea informațiilor sensibile din jurnale. Informațiile sensibile includ numere de identificare guvernamentale, adrese, numere de telefon, ID-uri de e-mail sau jetoane de acces etc.

6. Adăugați contextul adecvat la jurnalele dvs

Un alt pas esențial de reținut în timpul înregistrării este furnizarea contextului necesar, adică dezvoltatorul ar trebui să știe de unde provine jurnalul sau la ce se referă. Contextul face posibilă reconstruirea rapidă a acțiunilor care duc la un eveniment.

Winston oferă posibilitatea de a adăuga metadate globale (cum ar fi componenta sau serviciul în care a avut loc un eveniment) la fiecare intrare de jurnal generată. Într-o aplicație complexă, aceste informații din jurnalele dvs. sunt utile pentru depanarea problemelor, deoarece vă direcționează imediat către punctul de eșec.

const logger = createLogger({
  format: format.combine(format.timestamp(), format.json()),
  defaultMeta: {
    service: 'auth-service',
  },
  transports: [new transports.Console({})],
});

va fi afișată următoarea ieșire

1
{"message":"User loggedIn successfully","level":"info","service":"auth-service","timestamp":"2020-09-29T10:56:14.651Z"}

postat inițial la amodshinde.com.