Devo registrare ogni richiesta in un'applicazione web?

5

So che il logging dovrebbe raccontare una storia di ciò che fanno gli utenti. Ad esempio:

User 1 created a thing
User 2 deleted a thing
User 1 tried to access a thing and encountered an error

Questo è molto utile, ma ciò che è ancora più utile è avere informazioni dettagliate su ogni singola richiesta HTTP:

HTTP GET /Index, UserAgent="...", Username="...", HttpResponseStatus 200
HTTP POST /Index/123, UserAgent="...", Username="...", HttpResponseStatus 201
HTTP DELETE /Index/123, UserAgent="...", Username="...", HttpResponseStatus 200
HTTP GET /Index/123, UserAgent="...", Username="...", HttpResponseStatus 500

Avere informazioni su ogni richiesta che l'utente ha commesso sull'errore è molto utile quando si esegue il debug, sebbene questo tipo di informazioni attraversi un po 'il territorio di analisi e inquini i tuoi registri con molte richieste insulse (HTTP GET / Index x 1000 ).

Molti anni fa mi è stato insegnato che non dovrebbe registrare tutto . I tuoi registri dovrebbero "raccontare una storia" come sopra e niente di più.

Un po 'di recente nel mondo C # / MVC / ASP.NET, questo tipo di registrazione sembra incoraggiato da Serilog che ha incorporato "Enrichers" che registra le proprietà del livello di richiesta per impostazione predefinita:

var logger = new LoggerConfiguration()
            .Destructure.UsingAttributes()
            .Enrich.With(new HttpRequestIdEnricher())
            .Enrich.With(new UserNameEnricher())
            .Enrich.With(new HttpRequestRawUrlEnricher())
            .Enrich.With(new HttpRequestUserAgentEnricher())
            .Enrich.With(new HttpRequestTypeEnricher())
            .Enrich.WithProperty("ApplicationRole", "Web")
            .Enrich.FromLogContext()
            .WriteTo.Seq(ConfigurationManager.AppSettings["SeqServer"])
            .CreateLogger();

Insieme a Seq , queste richieste HTTP possono essere interrogate e abbinate alle tue tradizionali dichiarazioni di registro per raccontare una storia più prolissa dell'interazione dell'utente con la tua applicazione web.

Questo tipo di registrazione è considerato una buona pratica ora o esiste un modo migliore per raccogliere i registri di livello HTTP?

    
posta Craig Curtis 20.07.2017 - 01:21
fonte

2 risposte

8

Direi sia sì che no, ed ecco perché.

Sì, tutte le richieste devono essere registrate.

No, non dovresti registrarli.

Se ciò non ha ancora senso, lasciami espandere. :) Deve essere fatto, ma non è compito della tua applicazione farlo. Se stai usando ASP.NET, presumo che lo stai ospitando su un server IIS? IIS dovrebbe già essere configurato per registrare tutte le richieste. Se non lo è, assicurati che cambi. La tua applicazione dovrebbe registrare tutto ciò che è nel suo ambito di responsabilità. Cose che la richiesta non necessariamente saprà (ad es. Che questo utente abbia fatto questa cosa).

È anche possibile (dovrebbe anche, per un'app di produzione) assicurare che tutti i registri (richiesta, autorizzazione, app, ecc.) vengano inviati ad un aggregatore di registri. Questo rende sia più facile raccontare la "storia completa" come dici tu, ma ti protegge dagli hacker che riescono a entrare e poi vogliono nascondere la loro attività con i tuoi registri.

    
risposta data 20.07.2017 - 03:01
fonte
2

Penso che oggigiorno con la convenienza dello storage e della larghezza di banda e la disponibilità di registrazione centralizzata, la registrazione di tutto sia più semplice e puoi filtrare i log in tempo reale. Puoi essere prolisso quanto vuoi e non influire sulla capacità di leggere il "racconto" del registro.

Anche se non si sta utilizzando la registrazione centralizzata, la maggior parte dei framework di registrazione supporta la separazione dei registri in file diversi in base a determinati criteri, quindi è possibile inviare i registri HTTP non elaborati in un file e inviare la "storia" del registro a un file diverso.

    
risposta data 20.07.2017 - 01:27
fonte

Leggi altre domande sui tag