This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
ASP:n sovellusten loggingin osalta
Sunday, 27 October 2024
Esitys
Logging on OF COURSE kriittinen osa sovelluksia, mutta mielestäni se on usein väärin ymmärretty / väärin käytetty ASP:ssa.NET- sovelluksissaM SK2 Tämä on osittain posti ja osittain manifesti siitä, miten tehokkaasti voida rekisteröityä ASP:iin
Tämä ei ole täydellinen luettelointia koskeva opas.
Päätöslauselmassa merkinnän on oltava YHTEINEN; olipa kyse siitä, että merkintää te kehittäisitte tai merkinnät tehtäisiin tuotannossa, sen pitäisi olla hyödyllistä teille / joukkueellenne M SK4 käyttäjillenne
Ongelma
Liian usein metsästystä pidetään ”'” -na vain silloin, kun on poikkeuksia”, ' -na, “.”-na. Mielestäni tämä vääristää käsitystä siitä, mitä metsästyksen pitäisi olla” .“
LOGGING ei ole vain poikkeuksia
Yleisesti ottaen, teidän pitäisi voida käyttää merkittävää osaa hakemuksestanne paikallisesti; tässä yhteydessä log.LogInformation on ystävänne.
Ratkaisu
Loggointi onnistui
30 vuosien aikana olen kirjoittanut kodin IM SK2 olen nähnyt joitakin esimerkkejä hyvästä metsästystä ja paljon enemmän esimerkkejä huonosta metsästyksestä
Hyvän metsätalouden periaatteet:
- Kehityskäynnin aloittamisen yhteydessä on annettava riittävästi tietoa siitä, miten sovelluksenne toimii, jotta voidaan ymmärtää, mitä tapahtuu, kun
- Tuotteisiin kirjautuminen antaa teille erittäin nopean ja yksinkertaisen mekanismin ymmärtää, miten hakemuksenne epäonnistuu.
- TOO MYÖNTEISESTI logging tuotantoon on kielteinen; se voi hidastaa sovelluksenne ja vaikeuttaa tärkeiden asioiden löytämistäM SK1
Muistakaa; pöytäkirjan pitäminen aina heikentää sovelluksen suorituskykyä; teidän pitäisi kirjata se, mitä tarvitsette ongelman diagnoosimiseksi mutta ei enää tuotannossa M SK2 jossa suorituskyky on ratkaiseva (eMST4gMSC5 ette runna suorituskokeita käyttäessänne täysimääräistä debug-pöytäkirjaa
Luettelo ASP.NET-osoitteista
Serilog vs Microsoft.Laajennukset.Logging
ASP.NET:ssä on jo built-in talletusjärjestelmä Microsoft.Extensions.Logging. Tämä on hyvä rekisterijärjestelmä,, mutta se ' ei ole yhtä joustava kuin SerilogM SK3 Serilog on joustavampi rekisterijärjestelmä, joka antaa mahdollisuuden kirjautua useisiin kattovesoihin |( |tuloksia | ) | ja rikastaa rekisteriään lisätietoineen
BootStrap-loggerointi
Tämä on merkintää, joka tapahtuu, kun sovelluksenne aloitetaan. Se' on ensimmäinen asia, joka tulee tapahtumaanM SK2 ja se ' on ensi asia, jota teidän pitäisi nähdä, kun te olette hallinnoimassa hakemustanne.
Esimerkiksi Serilogissa voidaan tehdä tämä:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/boot-*.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 7)
.CreateBootstrapLogger();
PANEE MERKILLE: Tämä on rajoitettu, koska teillä ei ole pääsyä järjestelmään tässä vaiheessa, joten esimerkiksi AppInsightsin käyttämiseksi teidän olisi todennäköisesti tarvittava #if RELEASE sallimalla asianmukainen avain .
Tämä antaa teille tietoja kaikista ohjelmien käynnistämistä koskevista ongelmista.
Haluatte myös kätkeä aloitusmenetelmänne ( tähän appiin. Käytän uutta Program.cs menetelmä) tryssäM SK1catch and log any exceptions that happen there
try
{
..all your startup code
}
catch (Exception ex)
{
if(args.Contains("migrate"))
{
Log.Information("Migration complete");
return;
}
Log.Fatal(ex, "Application terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
Log.CloseAndFlush() on tärkeä, koska se varmistaa, että kaikki pöytäkirjat kirjoitetaan diskiin.
Tunnen myös, toimiiko app muuttoliikessa vai ei ja jos niin, merkin sen pöytäkirjaan ja poistun.
Log.Fatal on vakavin pöytäkirjataso; se ' käytetään, kun sovelluksenne on about to crash
Kaikki poikkeukset eivät ole kohtalokkaita - olisi käytettävä Log.Error niiden osalta ( elleivät ne tarkoita sitä, että pyyntöä ei ole käsitelty APP:ssa
Luettelotasot
ASP:ssa on lukuisia logitasoja:
Log.Fatal- Tämä on vakavin pöytäkirjataso, jota käytetään, kun sovelluksenne on about to crashLog.Error- Tätä käytetään, kun on poikkeus, joka merkitsee sitä, että APP:ta ei voida jatkaa kyseisen kohdan jälkeen.Log.Warning- Tätä käytetään, kun jotain tapahtuu, että ' ei ole virhe vaan se on asia, josta teidän pitäisi olla tietoinen. ei aivan oikein muttei virhe).Log.Information- Tätä käytetään yleiseen tietoon siitä, mitä ohjelmissanne tapahtuu.Log.Debug- Tätä käytetään tietoon, ettäM SK1 on hyödyllinen vain silloin, kun olette debugoimassa sovelluksenne ' se on hyödyllistä kaikkialla kehityksessä mutta se pitäisi sulkea tuotannossa
Tuotantoa varten I'd on yleensä asetettu Log.Fatal, Log.Error ja Log.Warning vain.
Runtime-logging
Toisin kuin aloituslogging, tämä on logging, joka tapahtuu, kun sovelluksenne on käynnissä.. Tämä on Logging, joka kertoo teille, mitä todellisuudessa tapahtuu.
Esimerkiksi näiden käyttämiseksi Serilogissa te olette tehneet tämän'd
"Serilog": {
"Enrich": ["FromLogContext", "WithThreadId", "WithThreadName", "WithProcessId", "WithProcessName", "FromLogContext"],
"MinimumLevel": "Warning",
"WriteTo": [
{
"Name": "Seq",
"Args":
{
"serverUrl": "http://seq:5341",
"apiKey": ""
}
},
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "logs/applog-.txt",
"rollingInterval": "Day"
}
}
],
"Properties": {
"ApplicationName": "mostlylucid"
}
},
Rikastaa
Kuten huomaatte, olen Serilogin suuri fani. Edellä mainitussa esimerkissä voitte nähdä, että I'm rikastaa pöytäkirjojani thread id:llä, thread nameM SK2 prosessin ID ja process name . Tämä voi olla hyvin hyödyllistä diagnosoinnissa ohjelmissanne esiintyvien ongelmien osaltaMSC4
Olen myös asettanut merkinnän menemään moneen 'sinks' (outputsM SK3 tässä tapauksessa lähetän sen konsoliinMSC5 tiedostoon ja Seq-osoitteeseen.
Useiden uimareiden saaminen on hyödyllistä siinä tapauksessa, että yksi epäonnistuu, tässä tapauksessa suosituin tallentamispalveluni on Seq, joten lähetän sen sinne ensin . Sitten jos se epäonnistuu, lähettelen sen konsoliin ja tiedostoonM SK3
Olen myös asettanut ApplicationName-oikeutta pöytäkirjoissa;, mikä voi olla hyödyllistä, jos on useita sovelluksia, jotka tallennetaan samaan palveluun (, jota levitettyjen sovellusten osalta usein teette; yhdessä korrelation ID:n kanssa, jotta pöytäkirjat yhdistettäisiin yhdeksi pyynnöstä
Esimerkiksi jos olette käyttänyt JS:n etuosaa ja .NETin takaosaa, voitte asettaa johdanto-osan korrelaatioidän ja siirtää sen takaosaanM SK1 Näin voitte nähdä kaikki pöytäkirjat yhdestä pyynnöstä yhdessä paikassa . tai jos omassa backendissänne käytetään HttpClient -palvelua, voitte siirtää johdanno-osan kohdassa olevan johdantason korrelatioidän toiselle palvelulle.
On paljon tietoa siitä, miten tämä voitaisiin tehdä täällä.: https://josef.codesM SK4append-correlation\ -id\MSC7to\M SK8all-log\MRK10entries\MST11in\MSR12asp\MSP13net\MSL14core\MSV15 mutta minä otan asian esille tulevassa lähetyksessä.
Structured Logging -järjestelmä
Structured logging on järjestelmällinen logiointitapa, jonka avulla helpotetaan logien hakua ja filtrointia. Serilogissa voidaan tehdä tämä käyttämällä Log.Information("This is a log message with {Property1} and {Property2}", property1, property2); syntax. Tämä helpottaa tiettyyn omaisuuteen kuuluvien pöytäkirjojen etsintää
Kontextuaalinen kirjaaminen
Serilogin avulla voi myös käyttää LogContext.PushProperty liittää pöytäkirjoihinne sellaiset ominaisuudet, jotka koskevat vain tiettyä soveltamisalaa. Tämä voi olla hyvin hyödyllistä diagnosoinnissa ohjelmissanne esiintyvien ongelmien osalta
Serilog -järjestelmä
Serilog on erittäin joustava siinä mielessä, että se mahdollistaa sen konfiguroinnin kodessa sekä config. Esimerkiksi käyttäessänne edellä mainittua järjestelmää te ette'd
builder.Host.UseSerilog((context, services, configuration) =>
{
configuration
.MinimumLevel.Warning()
.Enrich.FromLogContext()
.Enrich.WithThreadId()
.Enrich.WithThreadName()
.Enrich.WithProcessId()
.Enrich.WithProcessName()
.WriteTo.Seq("http://seq:5341", apiKey: "")
.WriteTo.Console()
.WriteTo.File("logs/applog-.txt", rollingInterval: RollingInterval.Day)
.Enrich.WithProperty("ApplicationName", "mostlylucid");
});
Tämä on sama kuin edellä mainitussa järjestelmässä, mutta kodessa.. Tämä on hyödyllinen, jos haluatte ottaa käyttöön tilaajankoodin.
Poikkeusfiltrit
ASP:ssa voidaan käyttää poikkeusfilterejä poikkeuksia vastaanottamiseksi ja niiden rekisteröimiseksi. Tämä on erinomainen tapa varmistaa, että kaikki poikkeukset ohjelmissanne rekisteröidään Vaikka se ei korvaa menetelmätasoa koskevaa logiointia, teidän pitäisi silti kirjata menetelmän tasolla, jotta voitte nähdä yksityiskohtaisesti, mitä tapahtuu sovellusessanne.
Tämä muuttui ASP:ssa, .:ssä ja NET Coreissa sekä 8:ssä. uudet ominaisuudet.
Virhe jälleen samoja periaatteita soveltaa; teidän pitäisi kirjata menetelmätasolla, jotta voitte nähdä yksityiskohtaisesti, mitä todellisuudessa tapahtuu hakemuksessanne.
DON'T LOG EVERYTHING IN PROD
Loggointi olisi sopiva ympäristölle; Kehityskäytössä tallennetaan kaikki niin, että voitte nähdä, mitä tapahtuu jokaisessa tilanteessa sovelluksessanne, mutta testauksessa tarvitaan vähemmän loggingia (joka saattaa tallentaa tietoja täälläM SK2 ja tuotannossa tarvitaan vielä vähemmän (varoitus ja edellä mainitut toimenpiteet
On kiusallista kirjata kaikki tuotantoon liittyvät tiedot, mutta se on huono ajatus.. olisi kirjattava kaikki tarvittavat tiedot ongelman diagnoosimiseksi, mutta ei enempää.. pilvipalvelujen tarjoajilta voidaan helposti periä maksu siitä määrästä tietoja, jotka lähetätte tallentamispalveluun, joten teidän pitäisi olla varovainen siitä, mitä kirjaatte ja kuinka kauan pidätte nämä pöytäkirjat.
Juuri äskettäin voittaneen ‐' ‐aktiivisen ‐ ' ‐appin ‐ ei tarvita pitkäaikaista tietojen rekisteröintiä ‐
Pyydän pöytäkirjan pitämistä
Kun tavallinen asia, jota näen tuotannossa, on epäonnistuneiden pyyntöjen tallentaminen;, kun taas nämä voivat olla mielenkiintoisia M SK1 kukaan ei halua 404 / \401) ne voivat olla valtava määrä tietoja ja niiden säilyttäminen voi olla hyvin kallista. teidän pitäisi vain tallentaa asioita aiotte korjata, on kenties tärkeää, koska se voi osoittaa, että ohjelmassanne oleva linkki on murtunut.
Kuten edellä mainitsin, ne on käsiteltävä paremmin kodessa, joka itse asiassa tapahtuu (, kun kyseessä on 401);, voi olla, että ne olisi myös talletettava Warning tai Error kodessa, joka itse asiassa tuottaa 401.
Toimenpiteet pyynnön kirjaamiseksi Serilogiin voidaan toteuttaa seuraavasti:
app.UseSerilogRequestLogging();
Tämä kirjaa kaikki pyynnöt hakemukseenne.
Ohjelmien tarkastelussa voi vielä haluta käyttää tietotasoa, koska se antaa teille hienon User Journey -mahdollisuuden; tämä on erinomainen tapa nähdä, miten käyttäjät käyttävät sovelluksenne ja voi olla hyvin hyödyllinen asioiden diagnoosimisessaM SK1 mutta nämä jälleen kerran nostavat nopeasti kustannuksia, joten teidän pitäisi olla varovainen siitä, mitä te tallennatte ja kuinka kauan te pidätte nämä tallennelut.
Päätelmissä
Näin ollen, että se on ASP:n ja NET- sovelluksien nopea käynti. Suuri osa siitä on reaktio ylimielisiin, hyödyttömiin pöytäkirjoihin, joita näen monissa tuotantokäytännöissä. Kehitysyhteistyössä haluatte nähdä miten sovellus toimii; tuotannossa, jota haluatte nähdä miten sovellus epäonnistuu. Loggointi on liian usein hyödytöntä, kallis osa sovellusten kehittämistä . Samoin kuin kaiken muun ohjelmistojen kehittämisessä, logioinnin olisi keskityttävä käyttäjiin; olipa kyse siitä, että te olette M SK3 muita kehittäjiä työskennellessänne IDE:ssään appiin / paikallisesti tai ratkaistatte kysymykset tuotannossa nopeasti ja tehokkaasti–.