企业库Librairy RollingFlatFileTraceListener解锁

时间:2017-07-11 15:15:36

标签: wpf locking enterprise-library

我们使用EnterpriseLibray在我们的应用程序中记录错误。由于某种原因,日志文件保持锁定状态,直到应用程序服务停止。

有没有选项让文件在不使用时解锁?我的目标是创建一个复制和压缩日志文件的外部进程(一种看门狗)....但它已被锁定。

有什么想法吗?

这就是我的app.config的样子:

<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>

1 个答案:

答案 0 :(得分:1)

锁定行为是设计使然并从TraceListener基类继承。

您可以选择几种方式:

  • 通读锁
  • 由于您使用的是RollingFlagFileTraceListener,因此可以对归档文件(不再锁定)进行操作。
  • 您可以在每次写入后释放文件锁

通读锁定

你可以使用这样的代码来读取文件的内容,即使它被锁定了:

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());
    }
}  

这应允许监视程序复制文件内容,但您可能必须管理状态,以便不会多次复制相同的日志条目(如果这对您很重要)。

复制存档文件

另一个想法是只压缩RollingFlatFileTraceListener存档的文件。这些文件不会被锁定。但是,归档不会定期发生,因此这可能不太合适。

解除锁定

另一个选择是在写LogWriter后通过处置LogEntry来解除锁定。这将起作用,但会产生性能开销(打开和关闭文件)并要求您管理并发(以避免在另一个线程使用它时关闭LogWriter)。

<强>加成

我毫不犹豫地提到它,但你可以写一个自定义的跟踪监听器来做任何你想做的事情。可能不是很好地利用时间,但它是一种选择。