Pourquoi la date est-elle annexe deux fois sur des noms de fichiers lors de l'utilisation de log4NET?

StackOverflow https://stackoverflow.com/questions/579688

  •  06-09-2019
  •  | 
  •  

Question

J'essayais d'ajouter la date à mon nom de fichier journal et j'ai pu le faire fonctionner en suivant les quelques suggestions que j'ai trouvées dans StackOverflow. Tout fonctionne bien, mais pour une raison quelconque, le premier fichier a toujours la date annexée deux fois.

Par exemple, au lieu de Log.2009-02-23.log, Je reçois Log.2009-02-23.log.2009-02-23.log.

Je l'ai trouvé si bizarre et pour info, c'est un code très simple. Ce n'est pas comme si je l'avais en cours d'exécution dans un environnement multithread.

Ma configuration log4net:

<log4net>
<appender name="MyLog" type="log4net.Appender.RollingFileAppender">
    <file value="../../Logs/Mylog"/>
    <staticLogFileName value="false" />
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <datePattern value=".yyyy-MM-dd.lo\g" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d{DATE} [%t] %-5p %c - %m%n"/>
    </layout>
</appender>
<root>
    <level value="INFO"/>
    <appender-ref ref="MyLog"/>
</root>
</log4net>

Des idées pourquoi?

Edit: Je souhaite ajouter les informations sur l'environnement dans lequel je le teste.
- asp.net
- .NET Framework 2.0
- Windows Server 2003 Pack de services 64 bits 2
- log4net 1.2.10

Était-ce utile?

La solution 2

C'est un problème d'autorisation. C'est du moins ce qui m'arrive.

Je suis nouveau dans l'utilisation de log4net donc je ne savais pas qu'il avait une journalisation interne mais je l'ai trouvé alors j'ai essayé de tourner journalisation interne sur. Je n'étais pas très sûr de ce qu'il dit, mais voici à quoi cela ressemble à moi: 1. Ajoutez la date du nom du fichier. 2. Essayez d'accéder au fichier pour y écrire (échoué). 3. Ajoutez la date au nom du fichier encore. 4. Accédez avec succès au fichier (qui a le nom de fichier étrange maintenant)

Avant de savoir cela, j'étais Google-ing pour la solution à ce problème avec des mots clés comme ce que j'ai comme titre sur cette question StackOverflow. Il n'y avait pas beaucoup d'informations là-bas. J'ai trouvé peut-être un gars qui a dit que cela arrivait à certaines personnes, mais je n'ai jamais vraiment expliqué pourquoi ni la solution. Avec ces nouvelles informations (+ le message d'erreur interne de LOG4NET), je regardais différents threads des moteurs de recherche. Avec cela, j'ai trouvé des indices que ce pourrait être un problème d'autorisation.

Il semble que l'application d'écriture n'ait pas une autorisation suffisante au dossier Logs. L'identité par défaut de l'application est généralement Network_Service. Après avoir donné plus de permission (je lui ai donné le contrôle total mais je ne sais pas quel est le minimum pour le faire fonctionner) dans le dossier, cela fonctionne très bien.

Si quelqu'un peut expliquer cela mieux que moi, n'hésitez pas à modifier.

Autres conseils

Cela se produit s'il y a un problème à accéder au fichier journal lorsque vous initialisez le système de journal. Cela peut se produire si vous initialisez le système de journal deux fois, si vous exécutez votre programme pendant qu'une autre copie est en cours d'exécution et d'écriture dans le fichier journal, ou si vous modifiez le fichier journal dans un éditeur de texte. Fondamentalement, tout ce qui provoque un verrouillage d'écriture sur le fichier journal lorsque le log4NET initis s'exécute.

Vérifiez votre code pour les appels en double à log4net init - peut-être que vous initialisez dans un constructeur plutôt que dans le constructeur statique d'un singleton ou l'initiale globale, par exemple.

Cela peut également se produire si vous exécutez une configuration de «jardin Web» et n'incluez pas le PID dans le nom de fichier, car chaque processus de serveur Web différent essaie d'écrire dans le même fichier. Si vous utilisez des jardins Web et en écrivant dans des fichiers, ajoutez le PID au modèle de nom de fichier afin que chaque processus de serveur obtienne son propre fichier.

Je rencontre le même problème. Pour moi, c'était une combinaison d'utiliser RollingFileAPpender pour mes journaux de test et d'exécuter mes tests Nunit avec Resharper.

Il s'avère que Resharper utilise deux Processus pour exécuter les tests:

2 TaskRunners

ce qui crée une condition de course sur le fichier journal.

Maintenant, si nous modifions le nom du fichier journal pour inclure l'ID de processus:

<appender name="MyLog" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="MyLog.pid.%processid" />
  <appendToFile value="true" />
  <rollingStyle value="Composite" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="false"/>
  <datePattern value="_yyyy-MM-dd'.log'"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d{HH:mm:ss.fff} [%15.15t] %-5p '%40.40c' - %m%n" />
  </layout>
</appender>

le problème est résolu. Chaque fichier obtient son propre nom unique:

Mylog.pid.5440_2010-10-13.log
Mylog.pid.1496_2010-10-13.log

Notez l'utilisation de Saut de motif pour «type».

J'espère que cela pourra aider.

Comme l'a souligné Olle. Votre problème est lié au « g», que votre log4net interprète comme un autre DateFormat. Essayez de supprimer le ".yyyy-mm-dd.lo g" et le remplacer par "yyyy-mm-dd"

Le ".log" n'appartient pas au DateFormat

J'utilise ce qui suit:

<param name="DatePattern" value="yyyy.MM.dd.\l\o\g"/>

Avec cela, je reçois des noms de fichiers comme: 2009.02.23.log

essayer <datePattern value=".yyyy-MM-dd.lo\g" /> Je ne comprends pas à quoi sert le g.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top