Andrea Azzola

Tips and Techniques for Lifestyle Design

Logging con NLog e SQLite

Posted on [Permalink]

Immagine introduttiva

Questo articolo spiega come ottenere una soluzione di logging portabile ed elegante grazie all'uso di NLog e SQLite, su piattaforma .NET e grazie all'uso di poche configurazioni.

NLog

NLog é una libreria di logging leggera e gratuita, supporta l'ecosistema .NET (Silverlight, Windows Phone etc…): http://nlog-project.org/. Costiusce un'opzione eccellente per un ampio range di scenari: dalle semplici utilities create nel quotidiano a servizi critici di produzione. Consente di avere multipli target, siano essi file, database, righe di comando, rete ed email.

Installazione

Package Manager:

PM> Install-Package NLog

Browser NuGet:

NLog on NuGet packet manager

SQLite

SQLite é semplice motore di database, diventato famoso nel mondo mobile grazie alle sue qualitá: per essere eseguito non richiede alcun demone server ne configurazioni particolari. Il database é tipicamente rappresentato da un singolo file (estensione .db3), mentre la lettura e la scrittura vengono gestite dalle librerie specifiche a seconda della piattaforma in cui viene eseguito, ed esse sono solitamente open source.

Setup

L'interfaccia .NET piú celebre é System.Data.SQLite

Package Manager Console

PM> Install-Package System.Data.SQLite

NuGet browser

SQlite on NuGet packet manager

Il file di configurazione NLog

Opzionale ma raccomandabile: l'utilizzo di un file separato per le configurazioni NLog. Ad esempio in caso di danneggiamento dello stesso, sarebbe desiderabile che solo la parte di logging fallisse e non l'intera applicazione. Applicare i principi della separation of concerns, quando possibile, é sempre un'ottima cosa.

Installazione

Package Manager

PM> Install-Package NLog.Config

Browser NuGet

NLog Configuration on NuGet packet manager

Eseguire NLog e SQLite in tandem

  1. Predisponi il database SQLite, usa il browser di Database SQLite od un client che preferisci per creare il database, quindi esegui il seguente statement T-SQL per creare la tabella dei Log:

     CREATE TABLE Log (Timestamp TEXT, Loglevel TEXT, Logger TEXT, 
      Callsite TEXT, Message TEXT) 
  2. Connetti l'App al database database, e modifica la configurazione NLog come segue:

      <?xml version="1.0" encoding="utf-8" ?>
      <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         throwExceptions="false">
       <targets>
         <target name="db" xsi:type="Database" 
             dbProvider="System.Data.SQLite" keepConnection="false" 
             connectionString="Data Source=${basedir}\Log.db3;Version=3;"
             commandText="INSERT into Log(Timestamp, Loglevel, Logger, Callsite, Message) 
              values(@Timestamp, @Loglevel, @Logger, @Callsite, @Message)">
               <parameter name="@Timestamp" layout="${longdate}"/>
               <parameter name="@Loglevel" layout="${level:uppercase=true}"/>
               <parameter name="@Logger" layout="${logger}"/>
               <parameter name="@Callsite" layout="${callsite:filename=true}"/>
               <parameter name="@Message" layout="${message}"/>
         </target>
       </targets>
       <rules>
         <logger name="*" minlevel="Warn" writeTo="db" />
     </rules>
     </nlog>
  3. Inizia il logging

    class Program {
     static Logger log = LogManager.GetCurrentClassLogger();
    
     static void Main(string[] args)
     {
         log.Info("Logging like a boss");
     }
    }
    

Fatto!

Puoi rivedere il codice sorgente e scaricare un progetto di esempio qui:
https://github.com/aazzola/nlog-sqlite/

Categories:

Comments

For the latest versions of the packages and visual studio 2013 update 3 you need to set the commandType="Text" in the target tag or you will get a method not supported error message.

~Edgar