什么是最好的翻转日志文件tracelistener for .NET

时间:2008-10-01 07:29:54

标签: .net logging

我正在为.Net寻找一个好的TraceListener,它支持根据大小限制滚动日志文件。

约束

  • 使用内置跟踪记录的.Net
  • 不属于某个巨大的图书馆的独立类或二进制文件
  • 允许根据大小滚动日志文件

9 个答案:

答案 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)

如其中一条评论中所述:

FileLogTraceListener Class

写入滚动文本文件。

  

说明

     

达到maxFileSize时使用新文件,以及每天使用   或由logFileCreationSchedule指定的每周基础。

     

每个文件都有格式的名称   “\( - )( - )。log”,用   包括每日和每周轮换的本地日期,以及序列   如果文件已存在,则附加数字。

答案 8 :(得分:0)

我有同样的问题。安全的环境,不允许开源。痛苦。 这是对我们有用的东西。

从TextWriterTraceListener派生,该成员添加用于最大日志大小,要保留的最大卷数的成员,并使用FileStream,并将Share and Access设置为ReadWrite并设置OpenOrCreate。它还应该创建并保存一个具有基于文件名的互斥体。

重写TraceEvent方法,等待互斥体,寻找流结束,调用Write,检查大小并在必要时滚动。释放互斥锁。

对于滚动,通过文件移动和删除来旋转先前的滚动,将当前文件复制到第一级滚动名称,在流上调用SetLength(0)。所有操作都在互斥锁中完成,但希望不会经常执行。这将跨进程工作,并避免使用那些笨拙的{GUID} mylog.log内容。