Questo articolo spiega come ottenere una soluzione di logging portabile ed elegante grazie all’uso di NLog e SQLite, su piattaforma .NET e con poche configurazioni.
NLog
NLog è una libreria di logging leggera e gratuita che supporta l’ecosistema .NET (Silverlight, Windows Phone, ecc.). Costituisce un’opzione eccellente per un ampio range di scenari: dalle semplici utilities quotidiane a servizi critici di produzione. Consente di avere multipli target, siano essi file, database, console, rete o email.
Installazione
Package Manager:
PM> Install-Package NLog
SQLite
SQLite è un motore di database semplice e leggero, molto diffuso soprattutto in ambito mobile. Non richiede alcun demone server né configurazioni particolari. Il database è un singolo file (estensione .db3
), mentre lettura e scrittura vengono gestite da librerie specifiche per piattaforma, generalmente open source.
Setup
L’interfaccia .NET più comune è System.Data.SQLite.
Package Manager Console:
PM> Install-Package System.Data.SQLite
File di configurazione NLog
È opzionale ma consigliato usare un file separato per le configurazioni di NLog. In questo modo, eventuali errori nel logging non compromettono l’intera applicazione (separation of concerns).
Installazione
PM> Install-Package NLog.Config
Eseguire NLog e SQLite insieme
Predisponi il database SQLite: usa il SQLite Database Browser o un altro client a scelta per creare il database, quindi esegui lo statement SQL seguente per creare la tabella dei log:
CREATE TABLE Log ( Timestamp TEXT, Loglevel TEXT, Logger TEXT, Callsite TEXT, Message TEXT )
Configura NLog per scrivere sul database:
<?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)"> </target> </targets> <rules> <logger name="*" minlevel="Warn" writeTo="db" /> </rules> </nlog>
Avvia il logging in C#:
class Program { static Logger log = LogManager.GetCurrentClassLogger(); static void Main(string[] args) { log.Info("Logging like a boss"); } }
Conclusione
Puoi trovare il codice sorgente e un progetto di esempio qui: https://github.com/aazzola/nlog-sqlite/{:target="_blank"}
Nota (2025): Per le versioni più recenti dei pacchetti e di Visual Studio (dalla 2013 Update 3 in avanti), è necessario aggiungere
commandType="Text"
nel tagtarget
, altrimenti si ottiene un errore method not supported.