Rešavanje problema u kodu: Vodič kroz tehnike logovanja
Da li se mučite sa ispravljanjem grešaka u vašem programskom kodu? Tražite li efikasne metode logovanja koje bi olakšale proces debagovanja? Nastavite sa čitanjem kako biste otkrili korisne savete i rešenja.
Razvoj softvera obuhvata nekoliko ključnih faza: prikupljanje zahteva, analiza, pisanje koda, testiranje i održavanje. Među ovim fazama, proces kodiranja je najzahtevniji u smislu vremena i napora. Softverski inženjeri se suočavaju sa različitim tipovima grešaka, uključujući sintaksne, logičke i greške u toku izvršavanja. Sintaksne greške se otkrivaju tokom kompilacije jer krše pravila programskog jezika.
S druge strane, logičke greške i greške u toku izvršavanja često ne mogu biti identifikovane od strane integrisanih razvojnih okruženja (IDE) i mogu biti teške za detektovanje i popravljanje. Debagovanje, odnosno proces pronalaženja i otklanjanja grešaka, može biti dugotrajan i zahteva detaljnu analizu.
Debagovanje je proces razumevanja zašto napisani kod ne funkcioniše kako je predviđeno. Proces je mnogo lakši kada je greška poznata i kada se zna tačna linija koda gde se ona javlja. U tom kontekstu, logovanje je izuzetno koristan alat za efikasnije debagovanje.
Šta je logovanje?
Logovanje je tehnika beleženja poruka tokom izvršavanja programa. Važno je beležiti samo one poruke koje su relevantne za proces debagovanja. Stoga, veština određivanja kada i koje informacije treba logovati je ključna. Takođe je važno razlikovati različite tipove poruka loga. Logovanje ima različite nivoe, uključujući informativne poruke, upozorenja, greške, poruke za debagovanje i detaljne poruke. Poruke o greškama i upozorenja se koriste za upravljanje izuzecima.
Podaci koji se vraćaju iz funkcija, rezultati manipulacije nizom, podaci preuzeti iz API-ja su primeri informacija koje se mogu logovati korišćenjem informativnih poruka. Detaljne (debug) i verbose poruke se koriste za davanje detaljnog opisa grešaka.
Log za debagovanje pruža informacije o steku poziva, ulaznim/izlaznim parametrima, itd. Verbose log daje listu svih događaja koji su se desili, ali nije detaljan kao debug log. Zapisi logova se mogu čuvati u konzoli, datotekama ili izlaznom toku. Postoje i alati za upravljanje logovima koji omogućavaju struktuirano i formatirano logovanje.
Logovanje u Node.js okruženju
Node.js je okruženje za izvršavanje JavaScript koda. Node.js aplikacije su asinhronog karaktera i koriste se u sistemima koji obrađuju velike količine podataka u realnom vremenu. Najbolji način da se upoznate sa Node.js je putem tutorijala i dokumentacije. Logovanje je od vitalnog značaja za poboljšanje performansi, rešavanje problema i praćenje grešaka. U Node.js okruženju, logovanje se može obaviti pomoću ugrađene funkcije console.log
. Takođe, postoje i brojni paketi koji nude dodatne funkcionalnosti za efikasno debagovanje.
Middleware se koristi za upravljanje zahtevima i odgovorima. Middleware može biti aplikacija ili bilo koji drugi JavaScript okvir. Logovanje u middleware-u se može obaviti preko aplikacija i rutera. Svaki Node.js logger mora da koristi npm
ili yarn install
komandu za instalaciju.
Npm je skraćenica od „Node Package Manager“, dok YARN znači „Yet Another Resource Negotiator“. Iako oba služe za instaliranje paketa, Yarn se smatra boljom opcijom jer je brži i instalira pakete paralelno.
Neki od najefikasnijih Node.js logger-a su navedeni u nastavku:
Pino
Pino je biblioteka koja se smatra jednim od najefikasnijih logera za Node.js aplikacije. To je open-source, izuzetno brz i loguje poruke u JSON formatu koji je lak za čitanje. Neki od Pino nivoa logovanja su: debug, warn, error i info poruke. Instanca Pino loggera se može uvesti u projekat, a naredbe console.log
se zamenjuju sa naredbama logger.info
.
Pino se može instalirati pomoću sledeće komande:
$ npm install pino
Generisani logovi su detaljni i u JSON formatu, ističući broj linije loga, tip loga, vreme kada je logovan, itd. Pino minimalno opterećuje aplikaciju tokom logovanja i vrlo je fleksibilan pri obradi logova.
Pino se može integrisati sa web okvirima kao što su Hapi, Restify, Express, itd. Logovi generisani od strane Pino-a se takođe mogu čuvati u datotekama. Koristi Worker niti za rad i kompatibilan je sa TypeScript-om.
Winston
Winston podržava logovanje za različite web okvire, sa naglaskom na fleksibilnost i proširivost. Podržava više tipova transporta i može čuvati logove na različitim lokacijama. Transporti predstavljaju mesta na kojima se čuvaju poruke loga.
Pored nekih ugrađenih transporta kao što su Http, Console, File i Stream, Winston podržava i druge transporte kao što su Cloud watch i MongoDB. Obavlja logovanje na različitim nivoima i formatima. Nivoi logovanja ukazuju na ozbiljnost problema.
Različiti nivoi logovanja su predstavljeni ispod:
{ error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6 }
Format izlaza loga se može prilagoditi, filtrirati i kombinovati. Logovi uključuju informacije o vremenskoj oznaci, oznakama povezanim sa logom, milisekundama koje su prošle od prethodnog loga, itd.
Winston takođe obrađuje izuzetke i neuhvaćena obećanja. Pruža dodatne funkcionalnosti kao što su arhiviranje upita tokom izvršavanja, logovanje u realnom vremenu itd. Prvo, Winston je potrebno instalirati. Zatim se kreira Winston konfiguracioni objekat, zajedno sa transportom, za čuvanje logova. Objekat loga se kreira pomoću funkcije createLogger()
kojoj se prosleđuje poruka loga.
Node-Bunyan
Bunyan se koristi za brzo logovanje u Node.js okruženju u JSON formatu. Takođe pruža CLI (Command Line Interface) alatku za pregled logova. Lagan je i podržava različita okruženja za izvršavanje kao što su Node.js, Browserify, Webpack i NW.js. JSON format logova je dodatno uređen korišćenjem funkcije lepog štampanja. Logovi imaju različite nivoe kao što su fatal, error, warn, info, debug i trace; svaki je povezan sa numeričkom vrednošću.
Svi nivoi iznad nivoa postavljenog za instancu se loguju. Bunyan stream je mesto gde se loguju rezultati. Podkomponente aplikacije se mogu logovati pomoću funkcije log.child()
. Sve log poruke su vezane za određenu matičnu aplikaciju. Tip toka može biti datoteka, rotirajuća datoteka, sirovi podaci itd. Primer koda za definisanje toka je prikazan ispod:
var bunyan = require('bunyan'); var log = bunyan.createLogger({ name: "foo", streams: [ { stream: process.stderr, level: "debug" }, ... ] });
Bunyan takođe podržava DTrace logovanje. Probe uključene u DTrace logovanje obuhvataju: praćenje loga, upozorenje loga, grešku loga, informaciju loga, otklanjanje grešaka loga i fatal. Bunyan koristi serializatore za generisanje logova u JSON formatu. Funkcije serializatora ne bacaju izuzetke i otporne su na greške.
Loglevel
Loglevel se koristi za logovanje u JavaScript aplikacijama. Takođe je jedan od efikasnijih Node.js logera jer je lagan i jednostavan. Loguje poruke na određenom nivou i koristi jednu datoteku bez zavisnosti za logovanje. Podrazumevani nivo loga je „upozorenje”. Izlazi loga su dobro formatirani zajedno sa brojevima linija. Neke od metoda koje se koriste za logovanje su: trace, debug, warn, error i info.
Otporni su na neuspehe u bilo kom okruženju. getLogger()
je metoda koja se koristi za preuzimanje objekta logger-a. Može se kombinovati sa drugim dodacima kako bi se proširile njegove funkcionalnosti. Neki od dodataka uključuju loglevel-plugin-prefix, loglevel-plugin-remote, ServerSend i DEBUG. Dodatak za dodavanje prefiksa poruka u log je prikazan ispod:
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
Build-ovi se pokreću pomoću komande npm run dist
, a testovi se mogu pokrenuti pomoću komande npm test
. Nivo loga podržava pakete Webjar, Bower i Atmosphere. Nova verzija Loglevel-a se objavljuje kad god se dodaju nove funkcionalnosti.
Signale
Signale se sastoji od 19 logera za JavaScript aplikacije. Podržava TypeScript i logovanje u opsegu. Sadrži tajmere koji pomažu u logovanju vremenske oznake, podataka i imena datoteke. Pored 19 logera kao što su wait, complete, fatal, fav, info itd., moguće je kreirati i prilagođene logove.
Prilagođeni logovi se kreiraju definisanjem JSON objekta i polja sa podacima loga. Takođe je moguće kreirati interaktivne logere. Kada je interaktivni loger postavljen na true, nove vrednosti iz interaktivnih beležnika zamenjuju stare.
Najbolji aspekt Signale-a je mogućnost filtriranja tajnih ili osetljivih informacija. Više tajni se čuva u nizu. addSecrets()
i clearSecrets()
su funkcije koje se koriste za dodavanje i brisanje tajni iz niza. Boostnote, Docz, Shower, Taskbook i Want koriste Signale za logovanje. Sintaksa za pozivanje API-ja iz Signale je sledeća:
signale.<logger>(message[,message]|messageObj|errorObj)
Broj preuzimanja Signale-a je preko 1 milion u trenutku pisanja ovog članka.
Tracer
Tracer se koristi za generisanje detaljnih poruka za logovanje. Logovane poruke se sastoje od vremenskih oznaka, imena datoteka, brojeva linija i imena metoda. Pomoćni paketi se mogu instalirati da bi se prilagodio izlazni format logovanja. Pomoćni paketi se mogu instalirati pomoću sledeće komande:
npm install -dev tracer
Tracer podržava transport datoteka, streamova i MongoDB. Podržava obojenu konzolu i uslove filtera u logovanju. Prvo, Tracer mora biti instaliran pomoću npm install
. Drugo, potrebno je kreirati objekat logger-a i odabrati tip konzole. Zatim, različiti nivoi loga ili tipovi se mogu specificirati preko objekta za dalje logovanje.
Prilagođeni filteri se mogu kreirati definisanjem sinhronih funkcija sa poslovnom logikom prisutnom u telu funkcije. Mikro šabloni kao što je tinytim se takođe mogu koristiti za sistemsko logovanje.
Cabin.js
Cabin se koristi za logovanje Node.js aplikacija na serverskoj i klijentskoj strani. Koristi se tamo gde je potrebno maskiranje osetljivih i kritičnih informacija. Ovo uključuje brojeve kreditnih kartica, BasicAuth zaglavlja, soli, lozinke, CSRF tokene i brojeve bankovnih računa. Isečak koda ispod prikazuje logovanje pomoću Cabin.js.
const Cabin = require('cabin'); const cabin = new Cabin(); cabin.info('hello world'); cabin.error(new Error('oops!'));
Sadrži više od 1600 naziva polja. Takođe sledi princip Bring Your Own Logger (BYOL). Ovo ga čini kompatibilnim sa raznim drugim logerima kao što su Ake, Pino, Bunyan, Winston, itd. Smanjuje troškove skladištenja na diskovima zahvaljujući automatskom strimovanju i baferovanju u Cabin-u. Kompatibilan je sa više platformi i lak je za debagovanje.
Logovanje na serverskoj strani zahteva korišćenje middleware-a za rutiranje i automatsko logovanje izlaza. Logovanje na strani pretraživača zahteva XHR zahteve i skripte. Koristi Ake koji prikazuje metapodatke, odnosno podatke o podacima, tragove steka i druge greške. SHOW_STACK
i SHOW_META
su logičke promenljive postavljene na true ili false da bi se prikazali ili sakrili tragovi steka i metapodaci.
NPMlog
Npmlog je osnovni tip logera koji koristi npm. Neke od metoda logovanja koje se koriste su: level, record, maxRecordSize, prefixStyle, heading i stream. Takođe podržava logovanje u boji. Različiti nivoi logovanja su: silly, verbose, info, warn, http i error. Primer koda za korišćenje npm logera je prikazan ispod.
var log = require('npmlog') // additional stuff ---------------------------+ // message ----------+ | // prefix ----+ | | // level -+ | | | // v v v v log.info('fyi', 'I have a kitty cat: %j', myKittyCat)
Sve poruke se potiskuju ako je „Infinity“ naveden kao nivo loga. Ako je „-Infinity“ naveden kao nivo loga, opcija za pregled poruka loga mora biti omogućena da biste videli logove.
Događaji i objekti poruka se koriste za logovanje. Prefiksi poruka se emituju kada se koriste događaji prefiksa. Objekti stila se koriste za formatiranje logova, kao što je dodavanje boje tekstu i pozadini, stil fonta kao što je bold, italic, underline itd. Neki npm log paketi su: broLog, npmLogger, npmdate-log itd.
Roarr
Roarr je logger za Node.js koji ne zahteva inicijalizaciju i proizvodi strukturirane podatke. Ima CLI i varijable okruženja. Kompatibilan je sa pregledačem. Može se integrisati sa Fastify, Elasticsearch, itd. Može razlikovati kod aplikacije i kod zavisnosti. Svaka poruka loga se sastoji od konteksta, poruke, sekvence, vremena i verzije. Različiti nivoi loga uključuju: trace, debug, info, warn, error i fatal. Primer koda o tome kako se loguje sa Roarr-om je sledeći:
import { ROARR, } from 'roarr'; ROARR.write = (message) => { console.log(JSON.parse(message)); };
Takođe, može se izvršiti serijalizacija grešaka, što znači da se instanca sa greškom može logovati zajedno sa kontekstom objekta. Neke od varijabli okruženja koje su specifične za Node.js i Roarr su ROARR_LOG
i ROARR_STREAM
. „adopt“ je funkcija koja se koristi sa Node.js za prenos svojstava konteksta na različite nivoe. Podređene funkcije se takođe mogu koristiti sa middleware-om tokom logovanja.
Zaključak
Logovanje je metoda praćenja različitih aktivnosti i događaja tokom izvršavanja programa. Ima vitalnu ulogu u debagovanju koda i pomaže u povećanju čitljivosti koda. Node.js je open-source okruženje za izvršavanje JavaScript koda. Neki od najefikasnijih Node.js logera su Pino, Winston, Bunyan, Signale, Tracer, Npmlog, itd. Svaki tip logera ima svoje specifičnosti kao što su profiliranje, filtriranje, strimovanje i transport.
Neki logeri podržavaju obojene konzole, dok su drugi pogodni za rukovanje osetljivim informacijama. Detaljni i formatirani logovi su od velike pomoći programerima dok pokušavaju da poprave greške u svom kodu. JSON format je generalno poželjniji za logovanje jer beleži podatke u obliku parova ključ/vrednost što ga čini lakšim za korišćenje.
Logeri se takođe mogu integrisati sa drugim aplikacijama i kompatibilni su sa više pretraživača. Uvek je preporučljivo da analizirate potrebe i aplikacije koje razvijate pre nego što odaberete tip logera koji želite da koristite.
Takođe možete pogledati kako da instalirate Node.js i NPM na Windows i macOS.