ASP:n sovellusten loggingin osalta (Suomi (Finnish))

ASP:n sovellusten loggingin osalta

Sunday, 27 October 2024

//

8 minute read

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:

  1. Kehityskäynnin aloittamisen yhteydessä on annettava riittävästi tietoa siitä, miten sovelluksenne toimii, jotta voidaan ymmärtää, mitä tapahtuu, kun
  2. Tuotteisiin kirjautuminen antaa teille erittäin nopean ja yksinkertaisen mekanismin ymmärtää, miten hakemuksenne epäonnistuu.
  3. 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:

  1. Log.Fatal - Tämä on vakavin pöytäkirjataso, jota käytetään, kun sovelluksenne on about to crash
  2. Log.Error - Tätä käytetään, kun on poikkeus, joka merkitsee sitä, että APP:ta ei voida jatkaa kyseisen kohdan jälkeen.
  3. 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).
  4. Log.Information - Tätä käytetään yleiseen tietoon siitä, mitä ohjelmissanne tapahtuu.
  5. 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–.

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.