企业库 RollingFlatFileTraceListener 解锁

Enterprise librairy RollingFlatFileTraceListener unlock

我们使用 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>

锁定行为是设计使然,继承自 TraceListener 基础 class。

有几个选项可供您选择:

  • 通读锁
  • 由于您正在使用 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 归档的文件。这些文件不会被锁定。但是,归档不会定期进行,因此这可能不太合适。

解除锁定

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

奖金

我不愿提及它,但您可以编写一个自定义跟踪侦听器来执行您想要的任何操作。可能不会很好地利用时间,但这是一个选择。