企业库 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}
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>
锁定行为是设计使然,继承自 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
)。
奖金
我不愿提及它,但您可以编写一个自定义跟踪侦听器来执行您想要的任何操作。可能不会很好地利用时间,但这是一个选择。
我们使用 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>
锁定行为是设计使然,继承自 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
)。
奖金
我不愿提及它,但您可以编写一个自定义跟踪侦听器来执行您想要的任何操作。可能不会很好地利用时间,但这是一个选择。