Máte problémy s laděním svého kódu? Hledáte efektivní způsoby, jak pomocí protokolování usnadnit proces hledání chyb? Pak čtěte dál, abyste se dozvěděli více.
Vývoj softwaru je rozdělen do několika klíčových fází: specifikace požadavků, analýza, samotné kódování, testování a následná údržba. Fáze kódování/vývoje je obzvláště náročná na čas a úsilí. Softwaroví inženýři se potýkají se syntaktickými, logickými a běhovými chybami. Syntaktické chyby jsou odhaleny při kompilaci a obvykle pramení z nedodržení syntaxe daného programovacího jazyka.
Logické a běhové chyby jsou však obtížněji detekovatelné pomocí integrovaných vývojových prostředí (IDE) a jejich ladění a oprava bývá náročná. Odstraňování chyb je časově náročný proces, který vyžaduje pečlivou práci.
Ladění je proces, při kterém se snažíme porozumět, proč kód nefunguje podle očekávání. Pokud známe přesnou chybu a řádek kódu, kde k ní dochází, je její oprava snazší. Proto je protokolování nepostradatelné pro efektivní ladění.
Co je to protokolování?
Protokolování je technika, při které se zaznamenávají zprávy během běhu programu. Je klíčové logovat pouze ty zprávy, které nám mohou pomoci při ladění. Důležité je také vědět, kdy a jak logovací příkazy do kódu vkládat. Stejně podstatné je rozlišování mezi různými úrovněmi protokolů. Mezi běžné úrovně patří informativní, varovné, chybové, ladicí a detailní. Pro zpracování výjimek se obvykle používají chybové a varovné zprávy.
Data vrácená z funkcí, výsledky manipulace s poli, data z API – to jsou příklady informací, které lze logovat pomocí informativních příkazů. Ladicí a detailní protokoly poskytují podrobný popis chyb. Ladicí protokol často obsahuje informace o trasování zásobníku, vstupních a výstupních parametrech. Detailní protokol je méně podrobný než ladicí, ale poskytuje přehled všech událostí, které se vyskytly. Protokoly lze zapisovat do konzole, do souborů nebo do výstupního proudu. Pro strukturované protokolování lze použít speciální nástroje pro správu protokolů.
Protokolování v Node.js
Node.js je běhové prostředí pro JavaScript. Aplikace Node.js jsou asynchronní, neblokující a využívají se v systémech náročných na data a v reálném čase. Nejlepším způsobem, jak se o Node.js dozvědět více, je prostudovat si tutoriály a dokumentaci. Protokolování je nezbytné pro zlepšení výkonu, odstraňování problémů a sledování chyb. V Node.js lze protokolovat pomocí vestavěné funkce console.log
. K dispozici jsou také různé balíčky pro efektivnější ladění.
Middleware se používá ke správě požadavků a odpovědí. Může to být aplikace nebo jiný framework Javascriptu. Protokolování v middleware lze provádět pomocí aplikací a routerů. Každý zapisovač pro Node.js vyžaduje pro instalaci protokolů použití příkazu npm install
nebo yarn install
.
Npm (Node Package Manager) a YARN (Yet Another Resource Negotiator) jsou nástroje pro správu balíčků. YARN bývá preferován, protože je rychlejší a instaluje balíčky paralelně.
Mezi nejlepší knihovny pro protokolování v Node.js patří například:
Pino
Pino je velmi oblíbená knihovna pro protokolování v Node.js aplikacích. Je to open-source řešení, které je extrémně rychlé a protokoluje zprávy ve formátu JSON. Mezi úrovně protokolování v Pino patří ladění, varování, chybové a informativní zprávy. Po importování instance Pino loggeru do projektu, nahradíte příkazy console.log
příkazy logger.info
.
K instalaci Pino použijte následující příkaz:
$ npm install pino
Vygenerované protokoly jsou detailní, ve formátu JSON a obsahují číslo řádku, typ protokolu, čas protokolování atd. Pino má minimální režii a je velmi flexibilní při zpracování protokolů.
Pino lze integrovat s webovými frameworky jako Hapi, Restify, Express. Protokoly generované Pino lze ukládat i do souborů. Pro svůj chod využívá pracovní vlákna a je kompatibilní s TypeScriptem.
Winston
Winston je další populární knihovna, která podporuje protokolování pro různé webové frameworky s důrazem na flexibilitu a rozšiřitelnost. Podporuje různé způsoby ukládání protokolů (transporty) a může ukládat protokoly do různých umístění. Transporty jsou místa, kam se ukládají logovací zprávy.
Kromě vestavěných transportů, jako je Http, Console, File a Stream, podporuje i transporty jako Cloud Watch a MongoDB. Protokolování provádí v různých úrovních a formátech. Úrovně protokolování indikují závažnost problému.
Různé úrovně protokolování jsou:
{ error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6 }
Výstupní formát protokolu lze přizpůsobit, filtrovat a kombinovat. Protokoly obsahují informace o časovém razítku, štítcích, milisekundách od předchozího protokolu atd.
Winston také zvládá výjimky a nedodržené sliby. Nabízí další funkce, jako je ukládání dotazů a streamování protokolů. Nejprve je třeba Winston nainstalovat. Poté se vytvoří konfigurační objekt Winston spolu s transportem pro uložení protokolu. Objekt logger se vytvoří pomocí funkce createLogger()
a předává se mu zpráva protokolu.
Node-Bunyan
Bunyan se používá pro rychlé protokolování v Node.js ve formátu JSON. Poskytuje také CLI (Command Line Interface) pro prohlížení protokolů. Je lehký a podporuje různá běhová prostředí jako Node.js, Browserify, WebPack a NW.js. Formát JSON je dále formátován pomocí funkce pro hezký tisk. Protokoly mají různé úrovně (fatal, error, warning, info, debug a trace); každá je spojená s číselnou hodnotou.
Zaznamenávají se všechny úrovně nad úrovní nastavenou pro danou instanci. Stream v Bunyanu je místo, kam se protokolují výstupy. Dílčí součásti aplikace lze protokolovat pomocí funkce log.child()
. Všechny podřízené loggery jsou vázané na konkrétní nadřazenou aplikaci. Typ streamu může být soubor, rotující soubor, nezpracovaná data atd. Ukázka kódu pro definování streamu:
var bunyan = require('bunyan'); var log = bunyan.createLogger({ name: "foo", streams: [ { stream: process.stderr, level: "debug" }, ... ] });
Bunyan také podporuje protokolování DTrace. Sondy zapojené do DTrace protokolování zahrnují log-trace
, log-warn
, log-error
, log-info
, log-debug
a log-fatal
. Bunyan používá serializátory pro vytváření protokolů ve formátu JSON. Funkce serializátoru nevyvolávají výjimky a jsou defenzivní.
Loglevel
Loglevel se používá pro protokolování v JavaScript aplikacích. Je to jeden z nejlepších logovacích nástrojů pro Node.js díky své nízké váze a jednoduchosti. Zaznamenává danou úroveň a používá k tomu jediný soubor bez závislostí. Výchozí úroveň protokolu je „varovat“. Výstupy protokolů jsou dobře formátované a obsahují čísla řádků. Mezi používané metody protokolování patří trace
, debug
, warn
, error
a info
.
Jsou odolné vůči selhání v jakémkoliv prostředí. getLogger()
je metoda používaná k načtení objektu loggeru. Lze jej kombinovat s dalšími pluginy pro rozšíření jeho funkcí. Mezi některé pluginy patří loglevel-plugin-prefix
, loglevel-plugin-remote
, ServerSend
a DEBUG
. Plugin pro přidávání prefixových zpráv:
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()); // Nezapomeňte zavolat metodu setLevel pro aplikaci pluginu
Sestavení se spouští příkazem npm run dist
a testy lze spustit příkazem npm test
. Úroveň protokolu podporuje balíčky Webjar, Bower a Atmosphere. Při každém přidání nových funkcí je vydána nová verze Loglevel.
Signale
Signale se skládá z 19 loggerů pro JavaScriptové aplikace. Podporuje TypeScript a protokolování v rozsahu. Skládá se z časovačů, které pomáhají zaznamenávat časové razítko, data a název souboru. Kromě 19 loggerů (wait
, complete
, fatal
, fav
, info
atd.) lze vytvářet vlastní logy.
Vlastní protokoly se vytvářejí definováním objektu JSON a polí s daty loggeru. Lze vytvořit i interaktivní loggery. Pokud je interaktivní logger nastaven na true, nové hodnoty z interaktivních loggerů přepíší staré.
Velkou výhodou Signale je schopnost filtrovat tajné a citlivé informace. Více tajných klíčů je uloženo v poli. addSecrets()
a clearSecrets()
jsou funkce používané pro přidávání a odstraňování tajných klíčů z pole. Signale se používá pro protokolování v aplikacích Boostnote, Docz, Shower, Taskbook a Vant. Syntaxe pro volání API ze Signale je:
signale.<logger>(message[,message]|messageObj|errorObj)
Počet stažení Signale v době psaní článku přesahuje 1 milion.
Tracer
Tracer slouží k vytváření detailních logovacích zpráv. Protokolovací zprávy obsahují časová razítka, názvy souborů, čísla řádků a názvy metod. Pro přizpůsobení výstupního formátu protokolování lze nainstalovat pomocné balíčky. Pomocné balíčky lze nainstalovat příkazem:
npm install -dev tracer
Tracer podporuje přenos souborů, streamů a MongoDB. Podporuje barevnou konzoli a podmínky filtru. Nejprve je nutné nainstalovat tracer pomocí npm install
. Poté je nutné vytvořit objekt loggeru a vybrat typ konzole. Následně lze nastavit různé úrovně protokolů.
Vlastní filtry lze vytvořit definováním synchronních funkcí s logikou v těle funkce. Pro protokolování systému lze použít i mikrošablony jako tinytim.
Cabin.js
Cabin se používá k protokolování node.js aplikací na straně serveru i klienta. Využívá se tam, kde je nutné maskovat citlivé informace jako čísla kreditních karet, hlavičky BasicAuth, soli, hesla, tokeny CSRF a čísla bankovních účtů. Níže uvedený kód ukazuje protokolování pomocí Cabin.js:
const Cabin = require('cabin'); const cabin = new Cabin(); cabin.info('hello world'); cabin.error(new Error('oops!'));
Obsahuje přes 1600 názvů polí. Dodržuje také princip Bring Your Own Logger (BYOL), díky čemuž je kompatibilní s logovacími nástroji jako Axe, Pino, Bunyan, Winston atd. Snižuje náklady na disky díky automatickému streamování a vyrovnávacím pamětem kabiny. Je kompatibilní s různými platformami a snadno se ladí.
Protokolování na straně serveru vyžaduje použití middlewaru pro směrování a automatické protokolování výstupu. Protokolování na straně prohlížeče vyžaduje požadavky a skripty XHR. Využívá Axe, která zobrazuje metadata, trasování zásobníku a další chyby. SHOW_STACK
a SHOW_META
jsou booleovské proměnné nastavené na true/false pro zobrazení/skrytí trasování zásobníku a metadat.
Npmlog
Npmlog je základní typ loggeru, který používá npm. Některé z používaných metod protokolování jsou úroveň, záznam, maxRecordSize
, prefixStyle
, nadpis
a proud. Podporuje i barevné protokolování. Různé úrovně protokolování jsou silly
, verbose
, info
, warn
, http
a error
. Ukázka kódu pro použití Npm:
var log = require('npmlog') // další prvky ---------------------------+ // zpráva ----------+ | // prefix ----+ | | // úroveň -+ | | | // v v v v log.info('fyi', 'I have a kitty cat: %j', myKittyCat)
Všechny zprávy jsou potlačeny, pokud je jako úroveň protokolu zadáno „Nekonečno“. Pokud je jako úroveň protokolu zadáno „-Infinity“, musí být povolena možnost zobrazování protokolovacích zpráv.
Události a objekty zpráv se používají k protokolování. Zprávy s předponami se vysílají při použití událostí s předponou. Objekty stylu se používají k formátování protokolů, například přidávání barev, nastavení tučného písma, kurzívy, podtržení. Některé z balíčků protokolu npm jsou brolog, npmlogger, protokol npmdate atd.
Roarr
Roarr je logger pro Node.js, který nevyžaduje inicializaci a vytváří strukturovaná data. Má CLI a proměnné prostředí. Je kompatibilní s prohlížečem a lze ho integrovat s Fastify, Fastify, Elastic Search atd. Dokáže rozlišovat mezi kódem aplikace a kódem závislostí. Každá logovací zpráva se skládá z kontextu, zprávy, sekvence, času a verze. Různé úrovně protokolů jsou trace
, debug
, info
, warn
, error
a fatal
. Ukázka kódu jak se používá Roarr:
import { ROARR, } from 'roarr'; ROARR.write = (message) => { console.log(JSON.parse(message)); };
Lze provést i serializaci chyb, což znamená, že je možné zaznamenat instanci s chybou včetně kontextu objektu. Některé z proměnných prostředí, které jsou specifické pro Node.js a Roarr, jsou ROARR_LOG
a ROARR_STREAM
. Funkce „Adopt“ se používá s node.js k předání kontextových vlastností na různé úrovně. Podřízené funkce lze při protokolování používat i s middlewarem.
Závěrem
Protokolování je způsob sledování různých aktivit a událostí během běhu programu a je klíčové pro ladění a zlepšení čitelnosti kódu. Node.js je open-source prostředí pro běh JavaScriptu. Mezi nejlepší logovací nástroje pro Node.js patří Pino, Winston, Bunyan, Signale, Tracer, Npmlog atd. Každý z nich má specifické funkce, jako je profilování, filtrování, streamování a transport.
Některé logovací nástroje podporují barevné konzole a jiné jsou vhodné pro zpracování citlivých informací. Podrobné a formátované protokoly jsou pro vývojáře největší pomocí při hledání a opravě chyb v kódu. Formát JSON se pro protokolování upřednostňuje, protože data zaznamenává ve formě párů klíč-hodnota, což je uživatelsky přívětivé.
Logovací nástroje lze také integrovat s dalšími aplikacemi a jsou kompatibilní s různými prohlížeči. Před výběrem konkrétního loggeru je důležité zvážit specifické potřeby a aplikace, které vyvíjíte.
Můžete si také prohlédnout návod jak nainstalovat Node.js a NPM ve Windows a macOS.