我们使用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}
Message: {message}{newline}
Category: {category}{newline}
Severity: {severity}{newline}
Title: {title}{newline}
Machine: {localMachine}{newline}
App Domain: {localAppDomain}{newline}
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 & Warnings" />
</specialSources>
</loggingConfiguration>
答案 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
)。
<强>加成强>
我毫不犹豫地提到它,但你可以写一个自定义的跟踪监听器来做任何你想做的事情。可能不是很好地利用时间,但它是一种选择。