9 Knihovny protokolů Node.js Můžete vyzkoušet lepší protokolování

Potýkáte se s laděním kódu? Hledáte nějaká řešení protokolování, která by mohla usnadnit ladění? Přečtěte si další informace.

Vývoj softwaru prochází několika fázemi: shromažďování požadavků, analýza, kódování, testování a údržba. Ze všech těchto fází vyžaduje fáze kódování/vývoje hodně času a úsilí. Softwaroví inženýři se zabývají syntaktickými chybami, logickými chybami a runtime chybami. Syntaktické chyby jsou identifikovány v době kompilace a vyskytují se v důsledku toho, že kód nedodržuje pravidla programovacího jazyka.

Na druhou stranu, logické a run-time chyby nelze identifikovat integrovaným vývojovým prostředím (IDE) a je často obtížné je ladit a opravit. Odstraňování chyb je časově náročný proces a vyžaduje hodně ladění.

Ladění je proces, ve kterém se člověk snaží pochopit, proč napsaný kód nefunguje podle očekávání. Je snadné vyřešit problém, když známe chybu a přesné řádky v kódu, kde se vyskytuje. Proto je protokolování velmi užitečné pro ladění kódu.

Co je protokolování?

Protokolování je technika, při které jsou zprávy zachycovány během provádění programu. Člověk musí logovat pouze ty zprávy, které by mu mohly pomoci při ladění. Je tedy nesmírně důležité vědět, kdy přidat příkazy protokolu do kódu. Stejně důležité je také rozlišování mezi příkazy protokolu. Existují různé úrovně protokolování, jako jsou informace, varování, chyba, ladění a podrobné informace. Pro zpracování výjimek se používají chybová a varovná prohlášení.

Data, která jsou vrácena z funkcí, výsledky po manipulaci s polem, data získaná z rozhraní API atd., jsou některé příklady dat, která lze protokolovat pomocí příkazů info. Debug a podrobné protokoly se používají k poskytnutí podrobného popisu chyb.

Protokol ladění poskytuje informace o trasování zásobníku, vstupních a výstupních parametrech atd. „Verbose“ není tak podrobné jako protokol „debug“, ale poskytuje seznam všech událostí, které nastaly. Protokoly se zapisují do konzole, souborů a výstupního proudu. Nástroje pro správu protokolů lze použít pro strukturované a formátované protokolování.

Protokolování Node.js

Nodejs je běhové prostředí javascriptu. Aplikace Node.js jsou asynchronní a neblokují se a používají se v systémech náročných na data a v reálném čase. Nejlepší způsob, jak se o Node.js dozvědět více, je projít si tutoriály Node.js a jeho dokumentaci. Protokolování je vyžadováno pro lepší výkon, odstraňování problémů a sledování chyb. Přihlášení do Node.js lze provést pomocí vestavěné funkce console.log. Také funkce ladění je propojena s více balíčky a lze ji efektivně používat.

Middleware se používá pro správu požadavků a odpovědí. Middleware může být aplikace nebo jakýkoli jiný rámec Javascript. Přihlašování do middlewaru lze provádět prostřednictvím aplikací a směrovačů. Každý zapisovač Node.js musí k instalaci protokolů použít příkaz npm nebo yarn install.

Npm znamená „Node Package Manager“ a YARN znamená „Yet Another Resource Negotiator“. Yarn je však preferován před npm, protože je rychlejší a instaluje balíčky paralelně.

Některé z nejlepších protokolů Node.js jsou uvedeny níže:

Pino

Pino je knihovna, která je jedním z nejlepších loggerů pro aplikace Node.js. Je to open source, extrémně rychlý a protokoluje příkazy ve snadno čitelném formátu JSON. Některé úrovně protokolu Pino jsou – ladění, varování, chybové a informační zprávy. Instanci Pino logger lze importovat do projektu a příkazy console.log je třeba nahradit příkazy logger.info.

K instalaci Pino použijte následující příkaz:

$ npm install pino   

Generované protokoly jsou propracované a ve formátu JSON, zvýrazňující číslo řádku protokolu, typ protokolu, čas, kdy byl protokolován, atd. Pino způsobuje minimální režii protokolování v aplikaci a je extrémně flexibilní při zpracování protokolů.

Pino lze integrovat s webovými frameworky jako Hapi, Restify, Express atd. Protokoly generované Pino lze také ukládat do souborů. K provozu používá pracovní vlákna a je kompatibilní s TypeScriptem.

Winstone

Winston podporuje protokolování pro různé webové rámce s primárním zaměřením na flexibilitu a rozšiřitelnost. Podporuje více druhů dopravy a může ukládat protokoly do různých umístění souborů. Transporty jsou místa, kde jsou uloženy zprávy protokolu.

Spolu s některými vestavěnými transporty, jako je Http, Console, File a Stream, podporuje další transporty, jako jsou Cloud Watch a MongoDB. Provádí protokolování v různých úrovních a formátech. Úrovně protokolování udávají závažnost problému.

Různé úrovně protokolování jsou uvedeny níže:

{
  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 také kombinovat. Protokoly obsahují informace o časovém razítku, štítcích spojených s protokolem, milisekundách uplynulých od předchozího protokolu atd.

Winston také zvládá výjimky a nedodržené sliby. Poskytuje další funkce, jako je ukládání dotazů, protokoly streamování atd. Nejprve je třeba nainstalovat Winston. Poté se vytvoří konfigurační objekt Winston spolu s transportem pro uložení protokolu. Objekt logger je vytvořen pomocí funkce createLogger() a je mu předána zpráva protokolu.

Node-Bunyan

Bunyan se používá pro rychlé přihlášení do node.js ve formátu JSON. Poskytuje také nástroj CLI (Command Line Interface) pro prohlížení protokolů. Je lehký a podporuje různá běhová prostředí, jako je Node.js, Browserify, WebPack a NW.js. Formát JSON protokolů je dále zkrášlen pomocí funkce hezkého tisku. Protokoly mají různé úrovně jako fatal, error, warning, info, debug a trace; každý je spojen s číselnou hodnotou.

Všechny úrovně nad úrovní nastavenou pro instanci jsou protokolovány. Bunyan stream je místo, kde se protokolují výstupy. Dílčí součásti aplikace lze protokolovat pomocí funkce log.child(). Všechny podřízené loggery jsou vázány 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 je uvedena níže:

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 protokolování DTrace zahrnují log-trace, log-warn, log-error, log-info, log-debug a log-fatal. Bunyan používá serializátory k vytváření protokolů ve formátu JSON. Funkce serializátoru nevyvolávají výjimky a jsou defenzivní.

Loglevel

Loglevel se používá pro přihlášení v Javascript aplikacích. Je to také jeden z nejlepších záznamníků Node.js, protože je lehký a jednoduchý. Loguje danou úroveň a pro logování používá jeden soubor bez závislostí. Výchozí úroveň protokolu je „varovat“. Výstupy protokolu jsou dobře naformátované spolu s čísly řádků. Některé metody používané pro protokolování jsou trace, ladění, varování, chyba a informace.

Jsou odolné vůči selhání v jakémkoli prostředí. getLogger() je metoda používaná k načtení objektu loggeru. Lze jej také kombinovat s dalšími pluginy pro rozšíření jeho funkcí. Některé z pluginů zahrnují loglevel-plugin-prefix, loglevel-plugin-remote, ServerSend a DEBUG. Plugin pro přidávání prefixových zpráv do protokolování je zobrazen níže:

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

Sestavení se spouští pomocí příkazu npm run dist a testy lze spustit pomocí příkazu 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.

Signál

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ů, jako jsou 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 protokolovače. Lze také vytvořit interaktivní loggery. Když je interaktivní logger nastaven na true, nové hodnoty z interaktivních loggerů přepíší staré.

Nejlepší na Signale je schopnost filtrovat tajné nebo 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. Boostnote, Docz, Shower, Taskbook a Vant používají Signale pro protokolování. Syntaxe pro volání API ze Signale je následující:

signale.<logger>(message[,message]|messageObj|errorObj)

Počet stažení Signale je v době psaní tohoto článku přes 1 milion.

Tracer

Tracer se používá k vytváření podrobných protokolovací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 pomocí následujícího příkazu.

 npm install -dev tracer

Tracer podporuje přenos souborů, streamů a MongoDB. Podporuje barevnou konzolu a podmínky filtru v protokolování. Zpočátku je nutné tracer nainstalovat pomocí npm install. Za druhé, musí být vytvořen objekt loggeru a musí být vybrán druh konzoly. Poté lze nad objektem zadat různé úrovně nebo typy protokolů pro další protokolování.

Přizpůsobené filtry lze vytvořit definováním synchronních funkcí s obchodní logikou obsaženou v těle funkce. Mikrošablony jako tinytim lze také použít pro protokolování systému.

Cabin.js

Cabin se používá pro protokolování aplikací node.js na straně serveru a klienta. Používá se tam, kde je vyžadováno maskování citlivých a kritických informací. To zahrnuje čísla kreditních karet, záhlaví BasicAuth, soli, hesla, tokeny CSRF a čísla bankovních účtů. Níže uvedený fragment kódu ukazuje protokolování pomocí Cabin.js.

const Cabin = require('cabin');
const cabin = new Cabin();
cabin.info('hello world');
cabin.error(new Error('oops!'));

Skládá se z více než 1600 názvů polí. Dodržuje také princip Bring Your Own Logger (BYOL). Díky tomu je kompatibilní s různými dalšími loggery jako Axe, Pino, Bunyan, Winston atd. Snižuje náklady na ukládání 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, tj. data o datech, trasování zásobníku a další chyby. SHOW_STACK a SHOW_META jsou booleovské proměnné nastavené na hodnotu true nebo false pro zobrazení nebo skrytí trasování zásobníku a metadat.

Npmlog

Npmlog je základní typ loggeru, který npm používá. Některé z používaných metod protokolování jsou úroveň, záznam, maxRecordSize, prefixStyle, nadpis a proud. Podporuje také barevné protokolování. Různé úrovně protokolování jsou hloupé, podrobné, info, varování, http a chyba. Níže je uveden ukázkový fragment kódu pro použití protokolu npm.

var log = require('npmlog')

// additional stuff ---------------------------+
// message ----------+                         |
// prefix ----+      |                         |
// level -+   |      |                         |
//        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 pro zobrazení protokolů povolena možnost zobrazení protokolovacích zpráv.

Události a objekty zpráv se používají k protokolování. Zprávy předpony jsou vysílány při použití událostí předpony. Objekty stylu se používají pro formátování protokolů, jako je přidání barvy do textu a pozadí, styl písma jako tučné písmo, kurzíva, podtržení atd. Některé balíčky protokolů 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. Může být integrován s Fastify, Fastify, Elastic Search atd. Dokáže rozlišovat mezi kódem aplikace a kódem závislosti. Každá zpráva protokolu se skládá z kontextu, zprávy, sekvence, času a verze. Různé úrovně protokolů zahrnují trasování, ladění, informace, varování, chyby a fatální. Ukázkový fragment kódu o tom, jak se provádí protokolování, je Roarr:

import {
  ROARR,
} from 'roarr';

ROARR.write = (message) => {
  console.log(JSON.parse(message));
};

Lze také provést serializaci chyb, což znamená, že instance s chybou může být zaznamenána spolu s kontextem objektu. Některé z proměnných prostředí, které jsou specifické pro Node.js a Roarr, jsou ROARR_LOG a ROARR_STREAM. „Adopt“ je funkce, která 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 také s middlewarem.

Závěrečná slova

Protokolování je způsob sledování různých aktivit a událostí během provádění programu. Protokolování hraje zásadní roli při ladění kódu. Pomáhá také zvýšit čitelnost kódu. Node.js je open source prostředí pro běh javascriptu. Některé z nejlepších záznamníků Node.js jsou Pino, Winston, Bunyan, Signale, Tracer, Npmlog atd. Každý typ záznamníku má své vlastní funkce, jako je profilování, filtrování, streamování a přeprava.

Některé loggery podporují barevné konzole a některé jsou vhodné pro zpracování citlivých informací. Podrobné a formátované protokoly nejvíce pomáhají vývojářům, když se snaží opravit chyby ve svém kódu. Formát JSON je obecně preferován pro protokolování, protože zaznamenává data ve formě párů klíč-hodnota, díky čemuž je uživatelsky přívětivý.

Loggery lze také integrovat s jinými aplikacemi a jsou kompatibilní s více prohlížeči. Před výběrem typu záznamníku, který chcete používat, je vždy vhodné podívat se na potřeby a aplikace, které vytváříte.

Můžete se také podívat na to, jak nainstalovat Node.js a NPM na Windows a macOS.