Uuden Paketti Go 1.21 tuo jäsennellyn loggingin vakiokirjastoon. Jäsennellyt lokit käyttävät avain-arvoparia, jotta ne voidaan analysoida, suodattaa, hakea ja analysoida nopeasti ja luotettavasti. Palvelimille logging on tärkeä tapa kehittäjille tarkkailla järjestelmän yksityiskohtaista käyttäytymistä, ja usein ensimmäinen paikka he menevät korjaamaan sen. log/slog Vakiokirjastolla on ollut logging-paketti, , koska Go julkaistiin alun perin yli vuosikymmen sitten. Ajan myötä olemme oppineet, että jäsennelty logging on tärkeää Go-ohjelmoijille. Se on johdonmukaisesti sijoittunut korkealle vuotuisessa tutkimuksessamme, ja monet paketit Go-ekosysteemissä tarjoavat sen. , käytetään yli 100 000 muussa pakkauksessa. log Saavutukset Kun on monia rakenteellisia lokitiedostojen paketteja, joista valita, suuret ohjelmat päätyvät usein sisällyttämään useamman kuin yhden niiden riippuvuuksien kautta. Pääohjelman on ehkä konfiguroitava kukin näistä lokitiedostojen paketeista niin, että lokitiedostojen tulostus on johdonmukainen: kaikki menee samaan paikkaan, samassa muodossa. Sisällyttämällä rakenteellinen lokitiedosto vakiokirjastossa voimme tarjota yhteisen kehyksen, jonka kaikki muut strukturoidut lokitiedostojen paketit voivat jakaa. Yksi kierros lyönyt lyönyt Tässä on yksinkertaisin ohjelma, joka käyttää : slog package main import "log/slog" func main() { slog.Info("hello, world") } Tästä kirjoituksesta, se painetaan: 2023/08/04 16:09:19 INFO hello, world Sillä funktio tulostaa viestin Info-päiväkirjan tasolla käyttämällä oletuspäiväkirjaa, joka tässä tapauksessa on oletuspäiväkirjan paketti – sama lokero, jonka saat kirjoittaessasi Tämä selittää, miksi tulos näyttää niin samalta: vain ”INFO” on uusi. ja alkuperäinen Paketti toimii yhdessä, jotta aloittaminen on helppoa. Info log log.Printf slog log Lisäksi , on toimintoja kolmelle muulle tasolle - ja ja Mutta myös yleisemmin Funktio, joka ottaa tason argumenttina. , tasot ovat vain kokonaislukuja, joten et ole rajoitettu neljään nimettyyn tasoon. Se on nolla ja on 4, joten jos logging-järjestelmälläsi on taso näiden välillä, voit käyttää 2 sitä varten. Info Debug Warn Error Log slog Info Warn Toisin kuin The paketti, voimme helposti lisätä avain-arvo-parit tulokseemme kirjoittamalla ne viestin jälkeen: log slog.Info("hello, world", "user", os.Getenv("USER")) Nyt tulos näyttää tältä: 2023/08/04 16:27:19 INFO hello, world user=jba Kuten jo mainitsimme, ’s ylimmän tason toiminnot käyttävät oletuspäiväkirjaa. Voimme saada tämän päiväkirjan nimenomaisesti ja kutsua sen menetelmiä: slog logger := slog.Default() logger.Info("hello, world", "user", os.Getenv("USER")) Jokainen ylimmän tason funktio vastaa menetelmää a Tulos on sama kuin ennenkin. slog.Logger Aluksi slogin tulos kulkee oletusasetuksen läpi , tuottamalla tuotos, jonka olemme nähneet yllä. Voimme muuttaa tuottoa muuttamalla Käytetään logon avulla. Sisäänrakennettuna on kaksi ohjainta. a lähettää kaikki lokitiedot lomakkeessa Tämä ohjelma luo uuden lokin käyttämällä Samalla tavoin hän kutsuu menetelmää : log.Logger käsittelee slog TextHandler key=value TextHandler Info logger := slog.New(slog.NewTextHandler(os.Stdout, nil)) logger.Info("hello, world", "user", os.Getenv("USER")) Nyt tulos näyttää tältä: time=2023-08-04T16:56:03.786-04:00 level=INFO msg="hello, world" user=jba Kaikki on muutettu avain-arvo-pariksi, ja sarjoja on lueteltu tarvittaessa rakenteen säilyttämiseksi. JSON-tulosta varten asenna sisäänrakennettu Sen sijaan : JSONHandler logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) logger.Info("hello, world", "user", os.Getenv("USER")) Nyt tuloksemme on JSON-objektien sekvenssi, yksi jokaista logging-puhelua kohden: {"time":"2023-08-04T16:58:02.939245411-04:00","level":"INFO","msg":"hello, world","user":"jba"} Et ole rajoittunut sisäänrakennettuihin käsittelijöihin. Kuka tahansa voi kirjoittaa käsittelijän toteuttamalla käsittelijä voi tuottaa tulosta tietyssä muodossa tai se voi kääriä toisen käsittelijän lisäämään toiminnallisuutta. Niissä Dokumentaatio osoittaa, miten kirjoitat käärien käsittelijän, joka muuttaa vähimmäistasoa, jolla lokitiedostot näytetään. slog.Handler Esimerkkejä slog Toistaiseksi käytettyjen ominaisuuksien vaihtoehtoinen avain-arvo-syntaksi on kätevä, mutta usein suoritettavien lokikirjoitusten osalta voi olla tehokkaampaa käyttää Tyyppi ja soita menetelmä. Nämä toimivat yhdessä minimoimaan muistin kohdentamisen. S-sarjoja, numeroita ja muita yleisiä tyyppejä. Attr LogAttrs Attr Tämä kutsu on tuottaa samanlaisen tuloksen kuin edellä, mutta tekee sen nopeammin: LogAttrs slog.LogAttrs(context.Background(), slog.LevelInfo, "hello, world", slog.String("user", os.Getenv("USER"))) On paljon enemmän kuin : slog Kuten LogAttrs-puhelu osoittaa, voit siirtää kontekstin.Konteksti joihinkin lokitoimintoihin, jotta käsittelijä voi poimia kontekstitietoja, kuten jäljitystietoja. (Kontekstin poistaminen ei estä lokitietueen kirjoittamista.) Voit soittaa Logger.With lisätä ominaisuuksia logger, joka näkyy kaikissa sen tulostus, tehokkaasti laskemalla yhteisiä osia useita log lausuntoja. Tämä ei ole vain kätevä, mutta se voi myös auttaa suorituskykyä, kuten alla. Ominaisuudet voidaan yhdistää ryhmiin.Tämä voi lisätä rakenteita lokitiedostoon ja auttaa erottamaan avaimet, jotka muuten olisivat identtisiä. Voit hallita, miten arvo näkyy lokeissa antamalla sen tyypin LogValue-menetelmällä, jota voidaan käyttää kirjaamaan strukturin kentät ryhmänä tai muokkaamaan arkaluonteisia tietoja muun muassa. Paras paikka oppia kaikista On se . slog Pakettiasiakirjat suorituskykyä Me halusimme Suuren mittakaavan suorituskyvyn saavuttamiseksi olemme suunnitelleet optimointiin liittyvät mahdollisuudet. • Optimointi menetelmä kutsutaan jokaisen lokitapahtuman alussa, mikä antaa käsittelijälle mahdollisuuden pudottaa ei-toivotut lokitapahtumat nopeasti. ja menetelmät sallivat käsittelijän muotoilla ominaisuuksia, jotka on lisätty Tämä ennakkomuotoilu voi tarjota merkittävän nopeuden, kun suuret ominaisuudet, kuten , lisätään a Sitä käytetään monissa puheluissa. slog Sitä Handler Enabled WithAttrs WithGroup Logger.With http.Request Logger Tietääksemme suorituskyvyn optimointityöstämme tutkimme olemassa olevissa avoimen lähdekoodin hankkeissa tyypillisiä lokalisointityyppejä.Olemme havainneet, että yli 95 prosenttia lokalisointimenetelmien kutsuista kulkee viisi tai vähemmän ominaisuutta. Sitten kirjoitimme vertailuarvoja, jotka kaappasivat yleisiä tapauksia ja käyttivät niitä oppaana nähdäksemme, mihin aika meni. Suunnitteluprosessi Sillä Paketti on yksi suurimmista lisäyksistä vakiokirjastoon sen jälkeen, kun Go 1 julkaistiin vuonna 2012. halusimme ottaa aikaa sen suunnitteluun, ja tiesimme, että yhteisön palaute olisi välttämätöntä. slog Huhtikuuhun 2022 mennessä olimme keränneet tarpeeksi tietoja osoittaaksemme, että jäsennelty kirjaaminen on tärkeää Go-yhteisölle. Aloitimme tarkastelemalla, miten olemassa olevat jäsennelty logging-paketit on suunniteltu. Olemme myös hyödyntäneet Go-moduulin välityspalvelimeen tallennettua suuren määrän avoimen lähdekoodin Go-koodia, jotta voisimme oppia, miten näitä paketteja todella käytettiin. Ensimmäinen suunnittelu sai tietoa tästä tutkimuksesta sekä Go:n yksinkertaisuuden hengestä. He ovat kaikki hyviä siinä, mitä he tekevät, ja olemassa olevan koodin korvaaminen, joka toimii hyvin, on harvoin hyvä käyttäminen kehittäjän aikaa. , joka kutsuu backend-liitäntä, Tällä tavoin olemassa olevat logging-paketit voivat puhua yhteiselle backendille, joten paketit, jotka käyttävät niitä, voivat olla vuorovaikutuksessa ilman, että niitä on kirjoitettava uudelleen. ja ja . Logger Handler Säästä Löytöjä Hylätty Olemme jakaneet alkuperäisen suunnittelun Go-tiimissä ja muilla kehittäjillä, joilla on laaja logging-kokemus. Teimme muutoksia heidän palautteensa perusteella, ja elokuuhun 2022 mennessä tunsimme, että meillä oli toimiva suunnittelu. julkisuuteen ja aloitti Vastaus oli innostunut ja suurelta osin myönteinen. Muiden jäsenneltyjen logging-pakettien suunnittelijoiden ja käyttäjien ymmärtäväisten kommenttien ansiosta teimme useita muutoksia ja lisäsimme muutamia ominaisuuksia, kuten ryhmiä ja Vaihdoimme kartoituksen log-tasoista integrointiin kahdesti. Kokeellinen toteutus GitHub keskustelu LogValuer Kahden kuukauden ja noin 300 kommentin jälkeen tunsimme, että olimme valmiita todelliseen ja mukana Ehdotuksen aihe keräsi yli 800 kommenttia ja johti moniin API:n ja täytäntöönpanon parannuksiin. : Ehdotuksen Suunnittelu doc context.Context Alun perin API tuki loggerien lisäämistä kontekstiin. Monet ajattelivat, että tämä oli kätevä tapa ohjata logger helposti koodin tasoilla, jotka eivät välittäneet siitä. Aluksi vastustimme ensimmäiseksi argumenttina kontekstiin siirtymistä koskevaa vakiomallia, koska emme halunneet, että jokainen logging-puhelu edellyttäisi kontekstia, vaan lopulta luotiin kaksi logging-menetelmää, yksi kontekstiin ja yksi ilman. Yksi muutos, jota emme olleet huolissamme, on avaimen ja arvon vaihtoehtoinen syntaksi ominaisuuksien ilmaisemiseksi: slog.Info("message", "k1", v1, "k2", v2) Monet tunsivat voimakkaasti, että tämä oli huono idea. Heidän oli vaikea lukea ja helppo saada väärin jättämällä avain tai arvo pois. He suosivat nimenomaisia ominaisuuksia rakenteen ilmaisemiseksi: slog.Info("message", slog.Int("k1", v1), slog.String("k2", v2)) Mutta tiesimme, että kevyempi syntaksi oli tärkeä, jotta Go olisi helppoa ja hauskaa käyttää, varsinkin uusille Go-ohjelmoijille. ja ja (Sen kanssa ) käytettiin onnistuneesti vaihtoehtoisia avaimia ja arvoja. lisäsimme Jotta tavalliset virheet, mutta ei muuttanut suunnittelua. logr go-kit/log zap SugaredLogger Katso tarkistus 15. maaliskuuta 2023 ehdotus hyväksyttiin, mutta vielä oli joitakin pieniä ratkaisemattomia kysymyksiä. Seuraavien viikkojen aikana ehdotettiin ja ratkaistiin kymmenen lisämuutosta. Ohjelma on toteutettu kokonaisuudessaan sekä paketti käsittelijöiden todentamiseen ja eläinlääkärin tarkistamiseen vaihtoehtoisten avainten ja arvojen oikeasta käytöstä. log/slog testing/slogtest Ja 8. elokuuta Go 1.21 julkaistiin, ja Toivomme, että löydät sen hyödylliseksi, ja yhtä hauskaa käyttää kuin se oli rakentaa. slog Ja suuri kiitos kaikille, jotka osallistuivat keskusteluun ja ehdotusprosessiin. ja valtavan. slog Resursseja Sillä Sitä varten Pakkauksessa selitetään, miten sitä käytetään ja annetaan useita esimerkkejä. Dokumentaatio log/slog Sillä on Go-yhteisön tarjoamia lisäresursseja, mukaan lukien erilaisia käsittelijöitä. Wikisivut Jos haluat kirjoittaa käsittelijän, ota yhteyttä . Kirjoita käsikirjoitus Kirjoittanut Jonathan Amsterdam Kuva: Jeff Smith Unsplashissa Pääosat Jeff Smith Unsplashit Tämä artikkeli on saatavilla The Go Blogissa CC BY 4.0 DEED -lisenssillä. Go Blogi Go Blogi