umožňuje mluvit o protokolování, můžeme? Arnold tady nesoucí obří deník se cítí jako vhodné intro k tomuto článku, ve kterém budeme hovořit o populárním uzlu.JS logovací rámce.
Pokud píšete nějaké dlouhé živé aplikace, podrobné protokolování je rozhodující pro špinění problémů a ladění. Bez protokolů byste měli několik způsobů, jak zjistit, jak se vaše aplikace chová, existují chyby, jaký je výkon, dělá vůbec něco nebo jen padá na každou další žádost, když se na ni nedíváte.
Požadavky
Umožňuje identifikovat několik požadavků, které můžeme použít do jámy rámců proti sobě. Některé z těchto požadavků jsou docela triviální, jiné nejsou tolik.
- časové razítko každého řádku protokolu. Tenhle je docela samozřejmý – měli byste být schopni zjistit, kdy došlo ke každé položce protokolu.
- formát protokolování by měl být snadno stravitelný lidmi i stroji.
- umožňuje více konfigurovatelných cílových proudů. Například můžete zapisovat protokoly trasování do jednoho souboru, ale pokud dojde k chybě, napište do stejného souboru, poté do souboru chyb a současně odešlete e-mail.
na základě těchto požadavků (a popularity) existují dva logovací rámce pro Node.js stojí mimo kontrolu, zejména:
- Bunyan Trent Mick.
- Winston je součástí Flatiron framework a sponzoruje nodejitstu.
konzole
než se dostaneme k Bunyanovi a Winstonovi, podívejme se na našeho starého přítele console
. Nejzákladnějším typem protokolování, který můžete udělat, je použití metod console.log
a console.error
. To je lepší než nic, ale sotva nejlepší řešení. Konzole zapisuje do STDOUT a STDERR, resp. Existuje velmi zajímavá námitka, pokud jde o metody console
v uzlu.js.
funkce konzole jsou synchronní, kdy cíl je terminál nebo do souboru (aby se zabránilo ztracené zprávy v případě předčasného ukončení) a asynchronní, kdy je potrubí (aby se zabránilo blokování na dlouhou dobu).
to znamená, Že v následujícím příkladu, stdout je non-blokování, zatímco stderr je blokování:
$ node script.js 2> error.log | tee info.log
Toto je v podstatě „roll svůj vlastní“ přihlášení přístup. Je plně manuální, musíte přijít s vlastním formátem a v podstatě vše spravovat sami. To je časově náročné, náchylné k chybám a pravděpodobně se budete chtít místo toho zaměřit na funkce aplikace. Vzhledem k tomu, že existují knihovny protokolování s otevřeným zdrojovým kódem, které jsou aktivně udržovány, nestojí to za námahu, pokud se snažíte soustředit na poskytování funkcí.
Winston
jeden z nejpopulárnějších uzlů.JS protokolování frameworks je Winston. Je navržen tak, aby jednoduchý a univerzální protokolování knihovna s podporou pro více transportů (transport ve Winstonově světě je v podstatě paměťové zařízení, např, kde vaše protokoly skončí být uloženy). Každá instance loggeru Winston může mít nakonfigurováno více transportů na různých úrovních protokolování.
Instalace
npm install winston
Použití
nejvíce základní Winston použití se skládá z volání výchozí instance, že je vyvezeno z winston
modul.
var winston = require('winston');winston.log('info', 'Hello distributed log files!');winston.info('Hello again distributed logs');
výše uvedené je stejné, jako:
Oba příklady vytvoří následující výstup:
info: Hello distributed log files!info: Hello again distributed logs
Formátování
Osobně jsem trochu zmatený tím, že nedostatek informací ve výchozím formatter. Neexistuje žádné časové razítko, název stroje nebo ID procesu a výstupní formát je mírně vhodný pro analýzu stroje. Poté jsem řekl, že všechny informace můžete získat sami s trochou práce navíc.
winston.info('Hello world!', {timestamp: Date.now(), pid: process.pid});
generuje následující výstup, který je více informativní, ale stále ne moc vhodné pro stroj rozebrat.
info: Hello world! timestamp=1402286804314, pid=80481
a Konečně, log
metoda poskytuje stejný řetězec interpolace metody jako util.format
, například:
winston.log('info', 'test message %d', 123);
Transportéry
Winston mohl být nakonfigurován přes konstruktor možnosti nebo vystaven metody, které jsou velmi důkladně zdokumentovány na stránce GitHub. Většina konfigurace se obvykle točí kolem různých transportů. Z krabice Winston přichází s konzole a na základě souboru transporty a když se podíváte na npmjs.org uvidíte, že existuje společenství moduly pro skoro vše, co si lze představit, od MongoDB komerčních platforem třetích stran.
jedním z nejvýznamnějších transportérů podle mého názoru je Winston-irc od Nathana Zadokse, který můžete použít k přihlášení chyb do IRC kanálu vašeho týmu. Vidím, že se to hodí.
winston.add(require('winston-irc'), { host: 'irc.somewhere.net', nick: 'logger', pass: 'hunter2', channels: { '#logs': true, 'sysadmin': }});
Více Dřevorubci
Jakmile se vaše žádost začíná růst, šance jsou, že budete chtít, aby několik dřevorubců s různými konfiguracemi, kde každý logger je zodpovědný za různé funkce oblasti (nebo kategorie). Winston to podporuje dvěma způsoby: prostřednictvím winston.loggers
a instancí winston.Container
. Ve skutečnosti je winston.loggers
pouze předdefinovanou instancí winston.Container
:
winston.loggers.add('category1', {console: { ... }, file: { ... }});winston.loggers.add('category2', {irc: { ... }, file: { ... }});
Nyní, že vaše dřevorubci jsou konfigurovány můžete požadovat Winston v soubor v aplikaci a přístup k těmto pre-nakonfigurován tak, loggery:
var category1 = winston.loggers.get('category1');category1.info('logging from your IoC container-based logger');
Toto je nejzákladnější Winston použití, ale tam jsou docela několik dalších funkcí, zejména:
- Profilování
- String interpolace
- Dotazování a streaming
- Zpracování výjimky
Bunyan
Ilustrační Brendan Corris
Bunyan Trent Mick je další protokolování rámec, který myslím, že by měly být považovány za. Bunyan zaujímá mírně odlišný přístup k protokolování než Winston, jehož posláním je poskytovat strukturované, strojově čitelné protokoly jako občané první třídy. Jako výsledek, záznam z Bunyan je jeden řádek JSON.stringify
výstup s některé společné názvy pro potřebné a společného pole pro záznam protokolu.
Instalace
npm install bunyan
Použití
var bunyan = require('bunyan');var log = bunyan.createLogger({name: 'myapp'});log.info('hi');log.warn({lang: 'fr'}, 'au revoir');
Což vytvoří následující výstup:
Jak můžete vidět, z krabice Bunyan není velmi lidský, přátelský, nicméně většina moderních protokolování systémy pochopit formátu JSON nativně, což znamená, že tam je málo co do činění tady krmit protokoly jinde pro skladování a zpracování. Ve výchozím nastavení je součástí každé zprávy poměrně málo metadat, jako je časové razítko, ID procesu, název hostitele a název aplikace.
samozřejmě, že nás, lidi, to nepřipadá moc stravitelné a řešit, že je tam bunyan
CLI nástroj, který bere v JSON přes STDIN. Zde je stejný příklad potrubím přes bunyan
:
node example.js | bunyan
generuje následující výstup:
INFO: myapp/13372 on pwony-2: hi WARN: myapp/13372 on pwony-2: au revoir (lang=fr)
hlavní výhodou je, že nemusíte nic měnit konfiguraci pro vývojové prostředí, vše, co musíte udělat, je potrubí na bunyan
. Podívejte se na stránku GitHub pro další dokumentaci k nástroji CLI.
JSON
Jedním z klíčových rozdílů mezi Bunyan a Winston je, že Bunyan funguje opravdu dobře, když se chcete přihlásit složitých kontextů a objektů. Podívejme se na tento řádek a jeho výstup z výše uvedeného příkladu:
můžete vidět, že {lang: 'fr'}
dostal se spojil s hlavní log objektu a au revoir
stal msg
. Teď si představte něco jako toto:
log.info(user, 'registered');log.info({user: user}, 'registered');
, Které produkuje:
Nebo když potrubím přes bunyan
:
krása tohoto přístupu bude jasné, když se podíváme na dítě dřevorubci.
podřízené loggery
Bunyan má koncept podřízených loggerů, který umožňuje specializovat logger pro dílčí součást vaší aplikace, tj. vytvoření nového loggeru s dalšími vázanými poli, která budou zahrnuta do jeho záznamů protokolu. Potomek logger je vytvořen s log.child(...)
. To přijde v neuvěřitelně užitečné, pokud chcete mít rozsahem loggery pro různé komponenty ve vašem systému, požadavky, nebo prostě volání funkcí. Podívejme se na nějaký kód.
Představte si, že chcete provést ID požadavku prostřednictvím všech řádků protokolu pro daný požadavek, abyste je mohli spojit dohromady.
req.log
logger bude vždy držet jeho kontextu předán do log.child()
funkce a spojit ji s všechny následné hovory, takže výstup bude vypadat nějak takhle:
{"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}
Serializers
Dva problémy vznikají, když Bunyan se snaží stringify celé objekty:
- Cyklické odkazy. Winston je zde o něco chytřejší a detekuje kruhové odkazy, když k nim dojde (výsledek
$ref=$
však není příliš užitečný). - nežádoucí šum. Připadá mi, že protože objekty jsou prvotřídní, je mnohem snazší si zvyknout na to, že všechno vyhodíte do protokolu.
pomoci vypořádat Se s oběma, Bunyan má koncept serializátor, které jsou v podstatě transformace funkcí, které umožňují působnosti stanoví obecně prošel objekty jen pole, která máte zájem:
Nyní se snaží log req
objekt by jen zahrnovat tři oblasti, které nás zajímají.
proudy
proudy v Bunyanu jsou to samé jako transportéry ve Winstonu – je to způsob, jak poslat vaše protokoly jinam pro účely zobrazení a ukládání. Bunyan používá zapisovatelné Stream rozhraní s některými dalšími atributy. A Bunyan logger instance má jednu nebo více proudy a jsou uvedeny s streams
možnosti:
var log = bunyan.createLogger({ name: "foo", streams: });
Zde je několik důležitých věcí, aby prozkoumala v Bunyan:
- Runtime log snooping prostřednictvím Dtrace podpora
- Log záznam polí
, Které si vybrat?
Winston a Bunyan jsou oba velmi vyspělé a zavedené logovací rámce a jsou velmi na stejné úrovni, pokud jde o funkce. Winston má spoustu komunitní podpory s různými logovacími moduly. Bunyan usnadňuje po vybalení z krabice analyzovat protokoly, ale ponechává spotřebu až uživatele (obecně syslog drain funguje docela dobře zde). Mám pocit, že to všechno přijde na preference a jak snadné je integrovat se svým stackem.
- co přichází k dalšímu vydání uzlu? Přečtěte si o osmi vzrušujících nových funkcích Node v0. 12 a o tom, jak je co nejlépe využít, od samotných autorů.
- připraveno k vývoji API v uzlu.js a připojit je k vašim datům? Podívejte se na uzel.JS LoopBack API framework. S jednoduchou instalací npm jsme usnadnili začátek lokálně nebo ve vašem oblíbeném cloudu.
- Potřebujete školení a certifikaci pro uzel? Zjistěte více o soukromých i otevřených možnostech, které StrongLoop nabízí.