Utilizzare al massimo il logging di Entity Framework 6

di , in LINQ,

Entity Framework 6 contiene un sistema di logging molto avanzato e soprattutto personalizzabile in base alle proprie esigenze. Di default, Entity Framework genera alcune informazioni di logging, ma non le utilizza in alcun modo. Tutavia bastano poche righe di codice per inviare tutte le informazioni come il codice SQL generato, il tempo di esecuzione e alcune informazioni sui dati manipolati (il numero di record modificati da una update per esempio) alla console di output di Visual Studio. Come detto, possiamo personalizzare il logging quindi possiamo cambiare sia la destinazione dell'output (cioè scrivere le informazioni su un file piuttosto che sull'output di Visual Studio), sia cambiare le informazioni mandate in output.

Entity Framework permette di loggare in due diversi modi: il primo è tramite una proprietà del DbContext e il secondo è intromettendosi nella pipeline di esecuzione dei comandi e iniettando una propria classe. cominciamo col vedere come sfruttare il primo metodo

Logging tramite Database.Log

La classe DbContext ha una proprietà che si chiama Database il cui tipo espone a sua volta una proprietà chiamata Log. Log è un delegato che possiamo impostare per farci inviare le informazioni di logging. Vediamo un esempio di utilizzo di questa proprietà.

using (var ctx = new NorthwindEntities())
{
  ctx.Database.Log = s => Debug.WriteLine(s);
  ...
}

In quest'esempio abbiamo impostato la proprietà Database.Log con un metodo che accetta in input una stringa "s", contenente il codice SQL e altre informazioni di esecuzione, e che scrive questa stringa nella console di Visual Studio. A questo punto, qualunque comando generato da quest'istanza del contesto (sia di lettura che di scrittura) viene inviato al metodo impostato in Database.Log. Il formato di questa stringa è impostato in Entity Framework ma possiamo anche modificarlo come vedremo successivamente quando vedremo la seconda tecnica di logging.

L'utilizzo di Database.Log è molto semplice da usare, ma presenta l'inconveniente di doversi ricordare di impostarla ogni volta che si istanzia il contesto in quanto non è statica. Per questo motivo, è conveniente creare un metodo (CreateContext per esempio) che istanzia il contesto, imposta la proprietà Database.Log e infine lo restituisce. Dal nostro codice invece che istanziare a mano il contesto, invochiamo questo metodo. Nel prossimo esempio possiamo vedere il codice da scrivere per utilizzare questo approccio.

private void CreateContext() {
  var ctx = new CreateContext();
  ctx.Database.Log = s => Debug.WriteLine(s);
}

using (var ctx = new CreateContext())
{
  ...
}

Inviare i comandi alla console di Visual Studio va bene in fase di sviluppo e debug dell'applicazione, ma non è una scelta praticabile per ambienti di produzione. Quando portiamo la nostra applicazione in produzione la cosa migliore da fare è loggare su un file o un database o Event Viewer o qualunque altro meccanismo che persista le informazioni. Per fare questo ci basta modificare il metodo CreateContext senza dover modificare altro nel nostro codice. Nel prossimo esempio vediamo come scrivere su uno store utilizzando l'enterprise library.

private void CreateContext() {
  var ctx = new CreateContext();
  ctx.Database.Log = s => {
    var loggingConfiguration = GetConfig();
    var writer = new LogWriter(loggingConfiguration);
    writer.Write(s);
  };
}

A questo punto la nostra applicazione scrive le informazioni di logging su uno store esterno, impostato nel metodo Getconfig, senza bisogno di aggiungere altro da codice.

A questo è chiaro che il metodo Database.Log è molto semplice e, se ben usato, anche abbastanza potente. Tuttavia soffre di una limitazione molto importante: le sole informazioni che può loggare sono quelle che gli vengono inviate dal motore di Entity Framework. Nella prossima sezione vedremo come personalizzare queste informazioni e come possiamo loggare anche senza l'uso di Database.Log infilandoci nella pipeline di esecuzione dei comandi.

3 pagine in totale: 1 2 3
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

Utilizzare al massimo il logging di Entity Framework 6 1010 4
| Condividi su: Twitter, Facebook, LinkedIn, Google+

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti