La chaîne DatePattern
doit être quelque chose que le SimpleDateFormatter
will accept. Malheureusement, cela signifie que, hors de la boîte, cela ne signifie pas être en mesure de définir la limite d'un numéro de semaine. Il existe des moyens d'obtenir cette valeur en C#, mais il n'est pas évident que nous puissions étendre le SimpleDateFormatter
ou fournir une implémentation différente de IDateFormatter
et l'utiliser à la place (ou même dans un RollingFileAppender
personnalisé). Alors, comment pouvons-nous obtenir un Log4Net RollingFileAppender
pour rouler chaque semaine?Avoir une Log4Net RollingFileAppender définie pour rouler chaque semaine
Répondre
Ce n'est pas si simple. RollingFileAppender utilise DateTime.ToString()
pour déterminer le "point de roulement". L'instruction de l'aide de log4net n'est pas fausse puisque la méthode SimpleDateFormatter
utilise également cette méthode, mais elle est quelque peu trompeuse: vous ne pouvez pas injecter un formateur de date différent pour faire fonctionner l'appender de fichier tournant comme vous le souhaitez.
Si vous avez vraiment besoin d'une fonction de déroulement par semaine, le plus simple serait de dériver du RollingFileAppender
et de surcharger la méthode AdjustFileBeforeAppend()
. N'a pas testé cela, mais cela devrait faire l'affaire.
J'ai eu le mien roulant chaque semaine. Vous devez définir votre format de date pour inclure le jour du mois afin de générer des noms de fichiers uniques.
class RollingOverWeekFileAppender : RollingFileAppender
{
private DateTime nextWeekendDate;
public RollingOverWeekFileAppender()
{
CalcNextWeekend(DateTime.Now);
}
private void CalcNextWeekend(DateTime time)
{
// Calc next sunday
time = time.AddMilliseconds((double)-time.Millisecond);
time = time.AddSeconds((double)-time.Second);
time = time.AddMinutes((double)-time.Minute);
time = time.AddHours((double)-time.Hour);
nextWeekendDate = time.AddDays((double)(7 - (int)time.DayOfWeek));
}
protected override void AdjustFileBeforeAppend()
{
DateTime now = DateTime.Now;
if (now >= nextWeekendDate)
{
CalcNextWeekend(now);
// As you included the day and month AdjustFileBeforeAppend takes care of creating
// new file with the new name
base.AdjustFileBeforeAppend();
}
}
}
Je sont également confrontés à la même question à rouler l'hebdomadaire de fichiers de journalisation, en testant la méthode de la solution de GLM, il est en quelque sorte ne fonctionne pas sur la version de log4net (1.2.15.0), mais inspiré par sa réponse, et étudier le code source, j'ai fait une solution pour générer le fichier journal par nom par semaine (du nom que la date de dimanche)
namespace log4net.Appender
{
class RollingOverWeekFileAppender : RollingFileAppender
{
public RollingOverWeekFileAppender()
{
IDateTime dt = new SundayDateTime();
DateTimeStrategy = dt;
}
class SundayDateTime : IDateTime
{
public DateTime Now
{
get { return CalcThisSunday(DateTime.Now); }
}
private DateTime CalcThisSunday(DateTime time)
{
// Calc this sunday
time = time.AddMilliseconds((double)-time.Millisecond);
time = time.AddSeconds((double)-time.Second);
time = time.AddMinutes((double)-time.Minute);
time = time.AddHours((double)-time.Hour);
return time.AddDays((double)(-(int)time.DayOfWeek));
}
}
}
}
et mon extrait du log.config
<appender name="Log" type="log4net.Appender.RollingOverWeekFileAppender">
<file type="log4net.Util.PatternString">
<conversionPattern value=".\log-" />
</file>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<encoding value="utf-8" />
<staticLogFileName value="false"/>
<appendToFile value="true" />
<rollingStyle value="Date"/>
<datePattern value="yyyyMMdd.lo\g"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date	%level	%logger{1}	%message%newline" />
</layout>
</appender>