我正在为.Net寻找一个好的TraceListener,它支持根据大小限制滚动日志文件。
约束
答案 0 :(得分:32)
您可以使用内置于.NET Framework的Microsoft.VisualBasic.Logging.FileLogTraceListener。不要让命名空间中的VisualBasic吓到你,你只需要引用microsoft.visualbasic.dll程序集,它应该可以正常使用C#。
答案 1 :(得分:7)
每当我需要进行网络跟踪时,我都会将此配置代码段保留下来。我不必通过在运行时在App.config中添加引用来添加显式引用VB DLL的项目。
<system.diagnostics>
<sources>
<source name="System.Net">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
<source name="System.Net.Http">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
<source name="System.Net.Sockets">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
</sources>
<switches>
<add name="System.Net" value="Verbose"/>
<add name="System.Net.Http" value="Verbose"/>
<add name="System.Net.Sockets" value="Verbose"/>
</switches>
<sharedListeners>
<add name="System.Net"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
traceOutputOptions="DateTime,ProcessId,ThreadId"
customLocation="c:\temp"
location="Custom"
logFileCreationSchedule="Daily"
baseFileName="NetworkTrace"/>
</sharedListeners>
<trace autoflush="true"/>
</system.diagnostics>
并在运行时添加引用
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.VisualBasic" culture="neutral" publicKeyToken="b03f5f7f11d50a3a"/>
<codeBase version="10.0.0.0" href="file://C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETFramework/v4.5/Microsoft.VisualBasic.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
答案 2 :(得分:4)
我正在使用NLog,我非常满意。源代码编写得很好,很容易扩展和修改。 文档很好,配置非常简单。
一些链接:
答案 3 :(得分:3)
我是log4net(http://logging.apache.org/log4net/index.html)的忠实粉丝,它很容易配置并支持您想要的任何日志类型,但也可以编写自定义的日志类型。
它还可以根据日志级别执行不同的操作。我们将所有消息记录到文本文件中并且错误 - &gt;致命的发送电子邮件
答案 4 :(得分:2)
我使用过Log4Net和Nlog。我更喜欢NLog,但是一旦他们设置好了你就会忘记他们在那里(直到有什么东西休息,然后你很高兴它就在那里!)。在interweb中应该有大量关于两者的文档
答案 5 :(得分:2)
FileLogTraceListener是一个常见的建议,但它会丢弃事件或在文件超过给定的最大大小时抛出异常。
我们创建了一个扩展它的类,并覆盖了Write / WriteLine方法。
有一个try/catch (InvalidOperationException)
,如果发生这种情况,我们会调用base.Close
并重命名文件(FullLogFileName
),如下所示(我们需要base.Close
,否则我们会得到'正在使用中的文件'错误):
在循环中,我们在末尾添加一个数字,并查看该文件是否存在;如果没有,请使用File.Move(FullLogFileName, newFileWithNumber)
,否则我们会继续增加数字,直到找到有效的文件名。还有一个锁,以确保给定的实例是线程安全的。
答案 6 :(得分:0)
考虑Enterprise Library Logging Application Block
确保仅安装Logging块,因为EntLib安装程序默认会检查所有块。
答案 7 :(得分:0)
如其中一条评论中所述:
写入滚动文本文件。
说明
达到maxFileSize时使用新文件,以及每天使用 或由logFileCreationSchedule指定的每周基础。
每个文件都有格式的名称 “\( - )( - )。log”,用 包括每日和每周轮换的本地日期,以及序列 如果文件已存在,则附加数字。
答案 8 :(得分:0)
我有同样的问题。安全的环境,不允许开源。痛苦。 这是对我们有用的东西。
从TextWriterTraceListener派生,该成员添加用于最大日志大小,要保留的最大卷数的成员,并使用FileStream,并将Share and Access设置为ReadWrite并设置OpenOrCreate。它还应该创建并保存一个具有基于文件名的互斥体。
重写TraceEvent方法,等待互斥体,寻找流结束,调用Write,检查大小并在必要时滚动。释放互斥锁。
对于滚动,通过文件移动和删除来旋转先前的滚动,将当前文件复制到第一级滚动名称,在流上调用SetLength(0)。所有操作都在互斥锁中完成,但希望不会经常执行。这将跨进程工作,并避免使用那些笨拙的{GUID} mylog.log内容。