2017-07-11 4 views
0

Nous utilisons l'EnterpriseLibray pour enregistrer l'erreur dans notre application. Pour une raison quelconque, le fichier journal reste verrouillé jusqu'à ce que le service de pplication soit arrêté.Enterprise librairy RollingFlatFileTraceListener déverrouiller

Y at-il une option pour laisser le fichier déverrouillé lorsqu'il n'est pas utilisé? Mon but est de créer un processus externe (une sorte de chien de garde) qui copie et zippe le fichier journal .... mais il est verrouillé.

Une idée?

C'est ce que mon app.config ressemble:

<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General"> 
    <listeners> 
     <add name="Rolling Flat File Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Culture=neutral, PublicKeyToken=31bf3856ad364e35" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Culture=neutral, PublicKeyToken=31bf3856ad364e35" fileName="Server.log" rollSizeKB="2024" footer="----------------------------------------" formatter="NovaLogFormatter" header="- NEW TRACE ----------------------------------------" rollFileExistsBehavior="Increment" maxArchivedFiles="20" /> 
    </listeners> 
    <formatters> 
     <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Culture=neutral, PublicKeyToken=31bf3856ad364e35" template="Timestamp: {timestamp(local)}{newline}&#xA;Message: {message}{newline}&#xA;Category: {category}{newline}&#xA;Severity: {severity}{newline}&#xA;Title: {title}{newline}&#xA;Machine: {localMachine}{newline}&#xA;App Domain: {localAppDomain}{newline}&#xA;Extended Properties:{newline}{dictionary({key}{newline}{value}{newline})}" name="NovaLogFormatter" /> 
    </formatters> 
    <categorySources> 
     <add switchValue="All" name="General"> 
     <listeners> 
      <add name="Rolling Flat File Trace Listener" /> 
     </listeners> 
     </add> 
     <add switchValue="All" name="Data" /> 
     <add switchValue="All" name="Security" /> 
    </categorySources> 
    <specialSources> 
     <allEvents switchValue="All" name="All Events" /> 
     <notProcessed switchValue="All" name="Unprocessed Category" /> 
     <errors switchValue="All" name="Logging Errors &amp; Warnings" /> 
    </specialSources> 
    </loggingConfiguration> 

Répondre

1

Le comportement de verrouillage est par la conception et héritée de la classe de base TraceListener.

Il y a quelques options disponibles pour vous:

  • Lisez la serrure
  • Puisque vous utilisez RollingFlagFileTraceListener, vous pouvez utiliser des fichiers archivés (qui ne sont plus verrouillé)
  • Vous pouvez libérer le verrouillage du fichier après chaque écriture

Lire l'écluse

Vous pouvez utiliser le code comme ceci pour lire le contenu du fichier, même si il est verrouillé:

using(var fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
using(var sr = new StreamReader(fs)) 
{ 
    while(!sr.EndOfStream) 
    { 
     Console.WriteLine(sr.ReadLine()); 
    } 
} 

Cela devrait permettre au chien de garde de copier le contenu du fichier, mais vous pouvez avoir à gérer l'état afin que le même journal les entrées ne sont pas copiées plusieurs fois (si c'est important pour vous).

Copier des fichiers archivés

Une autre idée est de ne fichiers zip qui ont été archivés par le RollingFlatFileTraceListener. Ces fichiers ne seront pas verrouillés. Cependant, l'archivage ne se fait pas à intervalles réguliers, ce qui peut ne pas convenir.

déverrouillage

Une autre option consiste à libérer le verrou en disposant du LogWriter après avoir écrit un LogEntry. Cela fonctionnera mais aura un surcoût de performance (ouvrir et fermer le fichier) et vous oblige à gérer la simultanéité (pour éviter de fermer le LogWriter lorsqu'un autre thread l'utilise).

Bonus

Je hésite à en parler, mais vous pourriez écrire un écouteur de la trace personnalisée qui ne ce que vous voulez. Probablement pas une grande utilisation du temps mais c'est une option.

+0

Merci beaucoup. Va probablement lire simplement le fichier et copier le contenu dans un autre fichier pour éviter le verrou .... semble trop simple, mais n'a pas d'événement penser à cette option. – michelqa