Windows Service, log4net e i log che spariscono
Quando metti in host la parte back-end su un servizio Windows vengono fuori tante belle cosette, una di queste è stata la sparizione dei file di log quando era attivo il rolling per data. Come libreria sto usando log4net, in particolare la versione 2.1.9.0 e succedeva che nella cartella di log trovava solo l’ultimo log, cioè quella della data corrente ancora in corso di append.
Il bug è dovuto al fatto che durante l’operazione di rolling viene eseguita una Move(pathAssoluto, pathRelativo) pertanto durante lo spostamento la copia andava a finire nella cartella System32, il servizio essendo configurato con utente a privilegi minimi non poteva scrivere in tale cartella e il file andava perduto.
<appender name="AppServer" type="log4net.Appender.RollingFileAppender, log4net">
<param name="File" value="Log/ServerLog.txt" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Date" />
<datePattern value=".yyyyMMdd" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{dd/MM/yyyy HH:mm:ss.fff} [%t] %-5p %m%n" />
</layout>
</appender>
Il bug pare sia stato risolto nella 2.1.10.0, per chi non può passare per via di alcune dipendenze, nel mio caso NHiberante, Castle Windsor, un workaround è quello di definire nella configurazione un path assoluto del file (in ambiente di produzione non è assolutamente un problema) o impostare come cartella corrente quella di esecuzione (bruttino questo, anche perché richiede intervento sul codice).
<appender name="AppServer" type="log4net.Appender.RollingFileAppender, log4net">
<param name="File" value="D:\BackEnd\Log\ServerLog.txt" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Date" />
<datePattern value=".yyyyMMdd" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{dd/MM/yyyy HH:mm:ss.fff} [%t] %-5p %m%n" />
</layout>
</appender>