lunedì 18 gennaio 2021

Log4Net e Microsoft.Extensions.Logging

Per .Net Core, e ancor i più in .Net 5, Microsoft ha introdotto nuove api per il logging, Microsoft.Extensions.Logging

Queste Api forniscono un layer di astrazione e delle interfacce per il logging, ma lasciano aperta l'implementazione vera  e propria: Microsoft offre un pacchetto nuget anche per il .Net Framework, oltre che per .Net Core

Microsoft consiglia l'utilizzo di Serilog come provider. Serilog ha già un'estensione pronta per agganciarsi alle nuove api di logging.

Ho provato ad usare questa estensione, ma ho rilevato problemi di compatibilità con le api Microsoft nell'uso dell'ultima versione. Ho dovuto fare un downgrade delle Api per poter compilare.

Un'altra estensione già pronta all'uso è NLog: è molto simile a log4Net, che finora era il framework più usato per il logging.

Anche in questo caso esiste una estensione già pronta per le nuove api Microsoft.

Ho provato a integrare anche questo sistema, ma anche qui è stato necessario fare un downgrade delle librerie Microsoft


Come dicevo prima, nei progetti un po' più vecchi usualmente il logging veniva gestito tramite log4Net.

Se si cerca poi di distribuire un progetto Web su una piattaforma Cloud tipo Azure il semplice log su file è molto limitante, mentre è molto più comodo poter avere log su strumenti come Application Insight e simili.

Non parliamo poi di compilare in Net Standard. log4Net supporta Net Standard 1.3 (vedi qui), quindi tutta la parte Ado.Net, che è supportata in Net Standard 2.1 da dei gran bei warning.

Tocca quindi fare un pianto ed un lamento e far evolvere il log: mica banale, visto che tante, se non tutte le classi che abbiamo scritto (se siamo stati dei bravi sviluppatori) fanno uso del log!

Si, però vorremmo anche salvaguardare i nostri files di configurazioni in log4net, perché nel tempo ce li siamo personalizzati al millimetro, con i livelli di log giusti, escludendo classi che non ci interessano, enfatizzandone altre ecc ecc. Inoltre è troppo lungo trasformare tutto in una sola volta. Va fatto in maniera progressiva, quindi i 2 ambienti devono poter convivere per un periodo di tempo.

Per far convivere i 2 ambienti bisogna scrivere un provider per log4Net. A quel punto le nostre configurazioni in log4net sono salve e possiamo, in maniera incrementale, sfilare classe per classe log4net e mettere Microsoft.Extensions.Logging.

E infatti è quello che mi son divertito a fare, e devo dire che funziona.


L'implementazione e i test relativi a tutti i metodi di log si trovano qui

https://bitbucket.org/andreapalloni/log4netprovider/src/master/