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.
- 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.
- a naplózási formátumnak könnyen emészthetőnek kell lennie mind az emberek, mind a gépek számára.
- 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 a
winston
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 autil.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 awinston.Container
példányain keresztül. Valójában awinston.loggers
csak egy előre meghatározott példányawinston.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ülbunyan
: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 revoir
msg
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ük
bunyan
: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 alog.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:
- 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).- 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.