Comparing Winston and Bunyan Node.js Logging

Lets talk about logging, shall we? Arnold tuo mukanaan jättimäistä lokia, – tuntuu sopivalta johdantolta tähän artikkeliin, – jossa puhumme suositusta solmusta.JS logging frameworks.

Jos kirjoitat mitä tahansa pitkäikäistä sovellusta, yksityiskohtainen kirjaaminen on ensiarvoisen tärkeää ongelmien havaitsemisen ja virheenkorjauksen kannalta. Ilman lokit sinulla olisi muutamia tapoja kertoa, miten sovellus käyttäytyy, onko virheitä, mikä on suorituskyky kuin, onko se tekee mitään ollenkaan tai se vain kaatumassa joka toinen pyyntö, kun et katso sitä.

Requirements

Lets identify a few requirements which we can use to pit the frameworks against each other. Osa vaatimuksista on aika triviaaleja, osa ei niinkään.

  1. aikaleima jokaiselle tukkiriville. Tämä on melko itsestään selvä – sinun pitäisi pystyä kertomaan, kun jokainen loki merkintä tapahtui.
  2. Hakkuuformaatin tulee olla helposti sulavaa niin ihmisille kuin koneillekin.
  3. mahdollistaa useita konfiguroitavia kohdevirtoja. Saatat esimerkiksi kirjoittaa jäljityslokeja yhteen tiedostoon, mutta kun virhe havaitaan, Kirjoita samaan tiedostoon, sitten virhetiedostoon ja lähetä sähköposti samanaikaisesti.

näiden vaatimusten (ja suosion) perusteella solmulle on olemassa kaksi lokikehystä.js kannattaa tsekata erityisesti:

  • Bunyan by Trent Mick.
  • Winston on osa Flatironin kehystä ja nodejitstun sponsoroima.

konsoli

ennen kuin pääsemme Bunyaniin ja Winstoniin, katsokaamme vanhaa ystäväämme console. Alkeellisinta hakkuutapaa voi käyttää console.log ja console.error menetelmiä. Tämä on parempi kuin ei mitään, mutta tuskin paras ratkaisu. Konsoli kirjoittaa STDOUT ja STDERR vastaavasti. console methods in Node on erittäin mielenkiintoinen varoitus.js.

konsolin toiminnot ovat synkronisia, kun kohde on pääte tai tiedosto (välttääkseen kadonneet viestit ennenaikaisen poistumisen yhteydessä) ja asynkronisia, kun kyseessä on putki (välttääkseen estämisen pitkiksi ajoiksi).

eli seuraavassa esimerkissä stdout ei estä, kun stderr estää:

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

Tämä on periaatteessa ”roll your own”-lokausmenetelmä. Se on täysin manuaalinen, sinun täytyy keksiä oma formaatti ja periaatteessa hallita kaikkea itse. Tämä on aikaa vievää, altis virheille ja luultavasti haluat keskittyä sovelluksen ominaisuuksia sijaan. Kun otetaan huomioon, että on olemassa avoimen lähdekoodin kirjauskirjastoja, joita ylläpidetään aktiivisesti, tämä ei ole vaivan arvoista, jos yrität keskittyä tuottamaan ominaisuuksia.

Winston

yksi suosituimmista solmuista.JS logging frameworks on Winston. Se on suunniteltu yksinkertaiseksi ja yleiseksi kirjauskirjastoksi, jossa on tuki useille kuljetuksille (Winstonin maailman kuljetus on lähinnä tallennuslaite, esim.jos lokit päätyvät tallennettaviksi). Jokaisessa Winston-metsurin esiintymässä voi olla useita kuljetuksia, jotka on määritetty eri kirjaustasoille.

asennus

npm install winston

käyttö

perustavanlaatuisin Winston-käyttö koostuu winston moduulista vietävän oletusesityksen kutsumisesta.

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

yllä oleva on sama kuin:

molemmat esimerkit tuottavat seuraavan tuotoksen:

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

formatointi

p> itse olen hieman ymmälläni oletusmuotoilijan yksityiskohtien puuttumisesta. Aikaleimaa, koneen nimeä tai prosessitunnusta ei ole ja esitysmuoto sopii lievästi koneen jäsentämiseen. Sanottuani, että saat kaiken tiedon ulos itse pienellä lisätyöllä.

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

tuottaa seuraavan tuotoksen, joka on informatiivisempi, mutta ei silti kovin paljon sovellu konetulostukseen.

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

lopulta log menetelmä tarjoaa samat merkkijonojen interpolointimenetelmät kuin util.format, esimerkiksi:

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

siirtimet

Winston voidaan konfiguroida rakentajan valinnoilla tai altistetulla menetelmällä, jotka on dokumentoitu hyvin perusteellisesti GitHub-sivulla. Suurin osa konfiguraatiosta pyörii tyypillisesti erilaisten kuljetusten ympärillä. Out of the box Winston mukana konsoli-ja tiedostopohjaiset kuljetukset ja jos sinulla on katsoa npmjs.org näet, että on olemassa yhteisö moduulit lähes kaikki kuviteltavissa aina MongoDB kaupallisen kolmannen osapuolen alustoille.

yksi merkittävimmistä transportereista mielestäni on Nathan Zadoksin Winston-irc, jolla voi kirjata virheitä tiiminsä IRC-kanavalle. Tästä on varmasti hyötyä.

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

Useita metsureita

kun hakemuksesi alkaa kasvaa, on todennäköistä, että haluat useita metsureita, joilla on eri kokoonpanot, joissa kukin metsuri vastaa eri ominaisuusalueesta (tai luokasta). Winston tukee tätä kahdella tavalla: winston.loggers ja winston.Container. Itse asiassa winston.loggers on vain ennalta määritelty esiintymä winston.Container:

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

nyt kun loggerisi on määritetty, voit vaatia Winstonia mihin tahansa sovellukseen sisältyvään tiedostoon ja käyttää näitä valmiiksi konfiguroituja loggereita:

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

lisää

Tämä on alkeellisinta Winstonin käyttöä, mutta on olemassa melko paljon muita ominaisuuksia, joista huomattavin:

  • profilointi
  • String interpolointi

  • kyselyt ja striimaus
  • exeptioiden käsittely

Bunyan

Brendan Corrisin kuvitus

Trent Mickin Bunyan kuvitus on toinen puunkorjuukehys, jota mielestäni tulisi harkita. Bunyan ottaa hieman erilainen lähestymistapa kirjaamisen kuin Winston tekee tehtävänsä tarjota jäsennelty, kone luettavissa lokit ensiluokkaisia kansalaisia. Tämän seurauksena Bunyanin log-tietue on yksi rivi JSON.stringify ulostulo, jolla on joitakin yhteisnimiä log-tietueen vaatimille ja yhteisille kentille.

asennus

npm install bunyan

käyttö

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

joka tuottaa seuraavan tuotoksen:

, kättelyssä Bunyan ei ole kovin ihmisystävällinen, mutta useimmat nykyaikaiset puunkorjuujärjestelmät ymmärtävät JSON-muodon natiivisti, mikä tarkoittaa, että täällä on vähän tekemistä lokien syöttämiseksi muualla varastointiin ja käsittelyyn. Oletuksena jokaiseen viestiin sisältyy melkoinen määrä metatietoa, kuten aikaleima, prosessin tunnus, palvelimen nimi ja sovelluksen nimi.

tietenkään me ihmiset emme pidä tätä kovin sulavana ja puhuttele, että on olemassa bunyan CLI-työkalu, johon vie JSON STDIN: n kautta. bunyan:

node example.js | bunyan

tuottaa seuraavan tuotoksen:

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

suurin hyöty tässä on se, että kehitysympäristöön ei tarvitse konfiguroida mitään uudelleen, tarvitsee vain putkahtaa bunyan. Hae lisää dokumentaatiota CLI-työkalusta GitHub-sivulta.

JSON

yksi keskeisistä eroista Bunyanin ja Winstonin välillä on se, että Bunyan toimii todella hyvin, kun halutaan lokeroida monimutkaisia Konteksteja ja olioita. Katsotaanpa tätä linjaa ja sen ulostuloa yllä olevasta esimerkistä:

näet, että {lang: 'fr'} sulautui päälokikohteeseen ja au revoir muuttui msg. Kuvitelkaa nyt jotain tällaista:

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

joka tuottaa:

tai kun pipetoidaan bunyan:

tämän lähestymistavan kauneus tulee selväksi, kun katsotaan lapsilokeroita.

Lapsiloggerit

Bunyanilla on lapsiloggaajien käsite, joka mahdollistaa metsurin erikoistumisen johonkin sovelluksen osakomponenttiin, ts. luodaksesi uuden metsurin, joka sisältää lisää sidottuja kenttiä, jotka sisällytetään lokitietueisiin. Lapsiloggeri luodaan log.child(...). Tämä on uskomattoman kätevä, jos haluat scoped loggers eri komponenttien järjestelmään, pyynnöt, tai vain tavallinen toiminto puhelut. Katsotaanpa koodia.

Kuvittele, että haluat kuljettaa pyynnön ID: n kaikkien lokirivien läpi tiettyä pyyntöä varten, jotta voit sitoa ne kaikki yhteen.

req.log logger pitää aina asiayhteytensä välitettynä log.child() funktioon ja yhdistää sen kaikkiin myöhempiin kutsuihin, jolloin ulostulo näyttäisi jotakuinkin tältä:

{"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}

h3> sarjanumerot

syntyy kaksi ongelmaa, kun Bunyan yrittää stringata kokonaisia objekteja:

  1. ympyräviitteet. Winston on tässä hieman fiksumpi ja havaitsee ympyränmuotoiset viittaukset niiden sattuessa (tulosulostulo $ref=$ ei kuitenkaan ole kovin hyödyllinen).
  2. kohinaa. Minusta tuntuu, että koska esineet ovat ensiluokkaisia, on paljon helpompi ottaa tavaksi vain heittää kaikki lokiin.

auttaakseen käsittelemään molempia, Bunyanilla on sarjalisaattorin käsite, jotka ovat pohjimmiltaan muunnosfunktioita, joiden avulla voit laajentaa yleisesti siirrettyjä objekteja vain niihin kenttiin, joista olet kiinnostunut:

nyt yritettäessä logittaa req objekti sisältäisi vain kolme kenttää, joista olemme kiinnostuneita.

purot

purot bunyanissa ovat sama asia kuin siirtimet Winstonissa – se on tapa lähettää lokit muualle näyttö-ja tallennustarkoituksiin. Bunyan käyttää kirjoitettavaa Stream-käyttöliittymää, jossa on joitakin lisäominaisuuksia. Bunyan logger-instanssissa on yksi tai useampia striimejä ja ne on määritelty seuraavasti: streams vaihtoehto:

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

lisää

tässä muutama merkittävämpi asia tutkittavaksi bunyanissa:

  • Runtime log snooping via DTrace-tuki
  • lokiennätyskentät

kumpi valita?

Winston ja Bunyan ovat molemmat hyvin kypsiä ja vakiintuneita hakkuukehyksiä ja ominaisuuksiltaan hyvin tasalaatuisia. Winstonilla on paljon yhteisön tukea erilaisilla kirjausmoduuleilla. Bunyan tekee lokien jäsentämisestä helppoa, mutta jättää kulutuksen käyttäjälle (yleensä syslog drain toimii täällä melko hyvin). Minusta se kaikki tulee alas etusija ja kuinka helppoa on integroida pino.

  • mitä on tulossa seuraavaan Solmujulkaisuun? Lue kahdeksan jännittävää uutta Node v0.12-ominaisuutta ja miten voit hyödyntää niitä kirjoittajilta itseltään.
  • valmis kehittämään sovellusliittymiä solmussa.js ja yhdistää ne dataasi? Katso solmua.JS LoopBack API framework. Olemme tehneet helpoksi päästä alkuun joko paikallisesti tai suosikkipilvelläsi yksinkertaisella npm-asennuksella.
  • tarvitsetko koulutusta ja sertifiointia solmulle? Lue lisää sekä yksityisistä että avoimista vaihtoehdoista StrongLoop tarjoaa.

Vastaa

Sähköpostiosoitettasi ei julkaista.