2015-03-09 3 views
1

En utilisant la configuration ci-dessous, environ la moitié du temps, je reçois deux journaux par un, un vide. Ils diffèrent par le nom de fichier par une seconde (log.2015-03-09_11-50-25 vs log.2015-03-09_11-50-26)Log4net créant parfois deux journaux, un vide

J'essaie d'avoir un journal par exécution de l'application de console .

<log4net> 

    <appender name="Log" type="log4net.Appender.FileAppender"> 
    <file type="log4net.Util.PatternString" value="C:\env\QA\Logs\consoleapp\log.%date{yyyy-MM-dd_HH-mm-ss}.txt"/> 
    <appendToFile value="true"/> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date %message%newline"/> 
    </layout> 
    </appender> 

    <root> 
    <level value="INFO"/> 
    <appender-ref ref="Log"/> 
    </root> 
</log4net> 

Ce dernier journal est le seul à être rempli/écrit.

Pourquoi cela se produit-il? Comment je le répare?

EDIT: Il s'avère que j'instanciais un second enregistreur dans mon code. Lorsque l'instanciation s'est produite pendant une seconde différente, un deuxième journal a été créé. L'appender fonctionnait correctement.

+0

enlever la deuxième spécificateur dans le nom du fichier. – user1666620

+0

votre approche peut être sous-optimale. Essayez d'utiliser nom d'utilisateur/pid/quelque chose d'autre unique à une période assez petite pour vos journaux comme "clé primaire" de votre nom de fichier journal – swe

+0

@swe timestamp est bon pour les noms de fichier journal - permet des noms de fichiers facilement lisibles et les place dans le contexte . – user1666620

Répondre

3

J'ai vu quelque chose de similaire auparavant - c'est dû au fait que la seconde est spécifiée dans le nom de fichier, et les écritures se produisent au bout d'une seconde et au début d'une autre.

<file type="log4net.Util.PatternString" value="C:\env\QA\Logs\consoleapp\log.%date{yyyy-MM-dd_HH-mm-ss}.txt"/> 

devrait être

<file type="log4net.Util.PatternString" value="C:\env\QA\Logs\consoleapp\log.%date{yyyy-MM-dd}.txt"/> 

Dans mon dernier emploi, quelqu'un mis le second spécificateur au nom du fichier journal et le serveur de production est venu près de se briser en essayant de la rendre les 150.000 fichiers contenus dans le journal dossier.

Edit:

Si vous voulez écrire une fois par course, vous pouvez ajouter ce qui suit à votre configuration log4net:

<rollingStyle value="Once" /> 

et vous pourriez besoin de définir l'attribut appendToFile faux .

log4net one file per run

de sorte que votre config ressemblerait à ceci:

<appender name="Log" type="log4net.Appender.FileAppender"> 
    <file type="log4net.Util.PatternString" value="C:\env\QA\Logs\consoleapp\log.%date{yyyy-MM-dd_HH-mm-ss}.txt"/> 
    <appendToFile value="false" />  
    <maxSizeRollBackups value="-1" /> <!--infinite--> 
    <rollingStyle value="Once" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date %message%newline"/> 
    </layout> 
    </appender> 
+0

Je ne veux pas écraser ou ajouter au journal précédent. Je veux un fichier séparé pour chaque course. Votre suggestion entraîne l'ajout du journal s'il tombe le même jour. – b15

+0

@ b15 J'ai mis à jour ma réponse – user1666620

+0

Même problème que mon article d'origine, mais remarqué quand le deuxième fichier est dans la même seconde, il en crée toujours deux, un avec un ".1" ajouté au nom de fichier – b15

1

J'utilise la solution de user1666620, mais a obtenu un fichier .log.1. s'avère que j'ai eu la ligne suivante dans mes AssemblyInfo.cs fichier:

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

Retrait la ligne ci-dessus fixé mon problème. Soit dit en passant, mes Program.cs ressemble:

public static class Program 
{ 
    static Program() 
    { 
     // Initialize logging 
     log4net.Config.XmlConfigurator.Configure(); 
    } 

    private static readonly ILog log = 
     LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

    ... 
}