Winston és Bunyan csomópont összehasonlítása.js naplózás

beszéljünk a naplózásról, rendben? Arnold itt kezében egy hatalmas Napló úgy érzi, mint egy megfelelő intro ezt a cikket, amelyben fogunk beszélni népszerű csomópont.js naplózási keretek.

Ha bármilyen hosszú élettartamú alkalmazást írsz, a részletes naplózás a legfontosabb a problémák észleléséhez és a hibakereséshez. Naplók nélkül kevés módja lenne megmondani, hogyan viselkedik az alkalmazás, vannak-e hibák, milyen a teljesítmény, egyáltalán csinál-e valamit, vagy csak minden más kérés fölé esik, amikor nem nézi.

követelmények

lehetővé teszi, hogy azonosítsunk néhány követelményt, amelyek segítségével a kereteket egymás ellen állíthatjuk. Néhány ilyen követelmény elég triviális, mások nem annyira.

  1. időbélyegző minden napló sorban. Ez elég magától értetődő – képesnek kell lennie arra, hogy megmondja, mikor történt az egyes naplóbejegyzések.
  2. a naplózási formátumnak könnyen emészthetőnek kell lennie mind az emberek, mind a gépek számára.
  3. lehetővé teszi a több konfigurálható cél stream. Például lehet, hogy nyomkövetési naplókat ír egy fájlba, de ha hibát észlel, írjon ugyanabba a fájlba, majd a hibafájlba, és egyidejűleg küldjön e-mailt.

ezen követelmények (és népszerűség) alapján két naplózási keretrendszer létezik a Node számára.js érdemes megnézni, különösen:

  • Bunyan Trent Mick.
  • Winston része a Flatiron keretrendszer által támogatott nodejitstu.

konzol

mielőtt eljutnánk Bunyanhoz és Winstonhoz, nézzük meg régi barátunkatconsole. A legalapvetőbb naplózási mód a console.log és console.error módszerek használata. Ez jobb, mint a semmi, de aligha a legjobb megoldás. A konzol az STDOUT-ra, illetve az STDERR-re ír. Van egy nagyon érdekes kivétellel tudni, amikor a console módszerek csomópont.js.

a konzol funkciói szinkronban vannak, ha a cél egy terminál vagy egy fájl (az elveszett üzenetek elkerülése érdekében idő előtti kilépés esetén) és aszinkron, ha cső (a hosszú ideig tartó blokkolás elkerülése érdekében).

vagyis a következő példában az stdout nem blokkoló, míg az stderr blokkoló:

$ node script.js 2> error.log | tee info.log

Ez alapvetően egy “roll your own” naplózási megközelítés. Ez teljesen kézi, meg kell, hogy dolgozzon ki a saját formátumban, és alapvetően kezelni mindent magad. Ez időigényes, hajlamos a hibákra, és valószínűleg inkább az alkalmazás funkcióira szeretne összpontosítani. Figyelembe véve, hogy vannak nyílt forráskódú naplózási könyvtárak, amelyeket aktívan karbantartanak, ez nem éri meg az erőfeszítést, ha a szolgáltatások nyújtására próbál összpontosítani.

Winston

az egyik legnépszerűbb csomópont.js fakitermelés keretek Winston. Úgy tervezték, hogy egy egyszerű és univerzális naplózási könyvtár, amely támogatja a több szállítást (a Winston világában történő szállítás lényegében egy tárolóeszköz, például ahol a naplók tárolódnak). A Winston logger minden példányának több transzportja lehet konfigurálva különböző naplózási szinteken.

telepítés

npm install winston

használat

A Winston legalapvetőbb használata awinston modulból exportált alapértelmezett példány meghívásából áll.

var winston = require('winston');winston.log('info', 'Hello distributed log files!');winston.info('Hello again distributed logs');

a fentiek megegyeznek:

mindkét példa a következő kimenetet eredményezi:

info: Hello distributed log files!info: Hello again distributed logs

formázás

személy szerint kissé zavarban vagyok az alapértelmezett formázó részleteinek hiánya miatt. Nincs időbélyegző, gépnév vagy folyamatazonosító, és a kimeneti formátum enyhén alkalmas a gép elemzésére. Miután azt mondta, hogy lehet kapni az összes információt ki magát, csak egy kis extra munka.

winston.info('Hello world!', {timestamp: Date.now(), pid: process.pid});

a következő kimenetet állítja elő, amely informatívabb, de még mindig nem nagyon alkalmas gépi elemzésre.

info: Hello world! timestamp=1402286804314, pid=80481

végül a log módszer ugyanazokat a karakterlánc-interpolációs módszereket biztosítja, mint a util.format, például:

winston.log('info', 'test message %d', 123);

transzporterek

Winston konfigurálható konstruktor opciókkal vagy exponált módszerrel, amelyek nagyon alaposan dokumentáltak a GitHub oldalon. A konfiguráció nagy része általában különféle szállítások körül forog. Out of the box Winston jön konzol és fájl alapú szállítások, és ha van egy pillantást npmjs.org látni fogja, hogy vannak közösségi modulok nagyjából mindent elképzelhető kezdve MongoDB kereskedelmi harmadik fél platformok.

véleményem szerint az egyik figyelemre méltóbb szállító a Nathan Zadoks winston-irc, amellyel hibákat naplózhat a csapat IRC csatornáján. Látom, hogy ez nagyon jól jön.

winston.add(require('winston-irc'), { host: 'irc.somewhere.net', nick: 'logger', pass: 'hunter2', channels: { '#logs': true, 'sysadmin': }});

több fakitermelő

Miután az alkalmazás növekedni kezd, valószínű, hogy több fakitermelő lesz, különböző konfigurációkkal, ahol minden fakitermelő felelős egy másik jellemző területért (vagy kategóriáért). Winston ezt kétféleképpen támogatja: a winston.loggers és a winston.Containerpéldányain keresztül. Valójában a winston.loggers csak egy előre meghatározott példánya winston.Container:

winston.loggers.add('category1', {console: { ... }, file: { ... }});winston.loggers.add('category2', {irc: { ... }, file: { ... }});

most, hogy a naplózók konfigurálva vannak, az alkalmazás bármely fájljában megkövetelheti a Winston-t, és elérheti ezeket az előre konfigurált naplózókat:

var category1 = winston.loggers.get('category1');category1.info('logging from your IoC container-based logger');

több

Ez a legalapvetőbb Winston használat, de van jó néhány más funkciók, leginkább:

  • profilozás
  • karakterlánc interpoláció
  • lekérdezés és streaming
  • Exeptions kezelése

Bunyan

Brendan Corris illusztrációja

Bunyan Trent Mick egy másik naplózási keretrendszer, amelyet szerintem figyelembe kell venni. Bunyan vesz egy kicsit más megközelítést fakitermelés, mint Winston így küldetése, hogy strukturált, géppel olvasható naplók első osztályú polgárok. Ennek eredményeként a Bunyan naplórekordja a JSON.stringify kimenet egyik sora, amely a naplórekord szükséges és közös mezőinek néhány gyakori nevét tartalmazza.

telepítés

npm install bunyan

használat

var bunyan = require('bunyan');var log = bunyan.createLogger({name: 'myapp'});log.info('hi');log.warn({lang: 'fr'}, 'au revoir');

amely a következő kimenetet hozza létre:

mint látható, a dobozból Bunyan nem túl emberbarát, azonban a legtöbb modern naplózási rendszer natív módon érti a JSON formátumot, ami azt jelenti, hogy itt kevés a teendő a naplók máshol történő tárolására és feldolgozására. Alapértelmezés szerint minden üzenethez elég sok metaadat tartozik, például időbélyegző, folyamatazonosító, gazdagép neve és alkalmazás neve.

természetesen mi, emberek, nem találjuk ezt nagyon emészthetőnek, és foglalkozzunk azzal, hogy van egy bunyan CLI eszköz, amelyhez a JSON-t az STDIN-en keresztül veszi fel. Itt ugyanaz a példa vezetve keresztül bunyan:

node example.js | bunyan

a következő kimenetet állítja elő:

 INFO: myapp/13372 on pwony-2: hi WARN: myapp/13372 on pwony-2: au revoir (lang=fr)

a fő előnye itt az, hogy nem kell újrakonfigurálni semmit fejlesztési környezet, mindössze annyit kell tennie, hogy cső bunyan. Pénztár a GitHub oldalon további dokumentációt a CLI eszköz.

JSON

az egyik legfontosabb különbség Bunyan és Winston között az, hogy Bunyan nagyon jól működik, ha összetett kontextusokat és objektumokat szeretne naplózni. Nézzük meg ezt a sort és annak kimenetét a fenti példából:

láthatja, hogy a{lang: 'fr'}összeolvadt a fő log objektummal, és aau revoirmsg lett. Most képzelj el valami ilyesmit:

log.info(user, 'registered');log.info({user: user}, 'registered');

amely előállítja:

vagy ha keresztül vezetjükbunyan:

ennek a megközelítésnek a szépsége világossá válik, ha megnézzük a gyermeknaplókat.

Child Loggers

Bunyan van egy koncepció gyermek loggers, amely lehetővé teszi, hogy szakosodnak a logger egy al-összetevője az alkalmazás, azaz. új naplózó létrehozása további kötött mezőkkel, amelyek szerepelnek a naplórekordokban. A gyermek naplózó jön létre log.child(...). Ez hihetetlenül hasznos, ha a rendszer különböző összetevőihez, kéréseihez vagy csak egyszerű függvényhívásokhoz szeretne távcsöveket használni. Nézzünk meg néhány kódot.

képzelje el, hogy egy adott kérés összes naplóvonalán keresztül szeretné hordozni a kérelem Azonosítóját, hogy össze tudja kötni őket.

a req.log logger mindig megtartja a kontextusát a log.child() függvénynek, és egyesíti az összes későbbi hívással, így a kimenet valahogy így néz ki:

{"name":"myapp","hostname":"pwony-2","pid":14837,"level":30,"reqId":"XXXX-XX-XXXX","user":"[email protected]","time":"2014-05-26T18:27:43.530Z","v":0}

sorosítók

két probléma merül fel, amikor Bunyan teljes objektumokat próbál húrozni:

  1. körkörös hivatkozások. Winston egy kicsit okosabb itt, és észleli a körkörös hivatkozásokat, amikor előfordulnak (azonban az eredmény kimenet $ref=$ nem túl hasznos).
  2. nem kívánt zaj. Számomra úgy érzi, hogy mivel a tárgyak első osztályúak, sokkal könnyebb megszokni, hogy mindent csak a naplóba dobunk.

hogy segítsen kezelni mind, Bunyan van egy koncepciója serializer, amelyek alapvetően transzformációs függvények, amelyek segítségével hatálya le általánosan átadott objektumok csak a mezőket, hogy érdekli:

most próbál naplózni req objektum csak tartalmazza a három területen, hogy mi érdekli.

Streams

Streams Bunyan ugyanaz, mint a szállítók Winston – ez egy módja annak, hogy küldje el a naplókat máshol megjelenítési és tárolási célokra. Bunyan írható Stream felületet használ néhány további attribútummal. A Bunyan logger példány egy vagy több folyammal rendelkezik, és a streams opcióval van megadva:

var log = bunyan.createLogger({ name: "foo", streams: });

tovább

íme néhány figyelemre méltó dolog, amelyet meg kell vizsgálni Bunyanban:

  • futásidejű napló snooping via DTrace támogatás
  • naplórekord mezők

melyiket válassza?

Winston és Bunyan egyaránt nagyon érett és megalapozott naplózási keretek, és nagyon sok a par szempontjából jellemzői. Winston sok közösségi támogatással rendelkezik különféle naplózási modulokkal. Bunyan megkönnyíti a dobozból, hogy elemezze naplók, de elhagyja fogyasztás fel a felhasználó (általában syslog drain működik elég jól itt). Úgy érzem, minden jön le, hogy preferencia, és milyen egyszerű, hogy integrálja a verem.

  • mi jön a következő csomópont kiadás? Olvassa el a nyolc izgalmas új Node v0.12 funkciót, és hogyan lehet a legtöbbet kihozni belőlük, maguktól a szerzőktől.
  • készen áll az API-k fejlesztésére a Node-ban.js és kap őket csatlakozik az adatokat? Nézze meg a csomópontot.js LoopBack API keretrendszer. Egy egyszerű npm telepítéssel megkönnyítettük a helyi vagy a kedvenc felhőn való elindulást.
  • szüksége van képzésre és tanúsításra a csomóponthoz? Tudjon meg többet mind a privát, mind a nyitott opciókról, amelyeket a StrongLoop kínál.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.