Windows Service, log4net e i log che spariscono

Published 9 February 9 6:6 PM | Tommaso Caldarola

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>