【问题标题】:What the best rollover log file tracelistener for .NET.NET 的最佳翻转日志文件跟踪侦听器是什么
【发布时间】:2008-10-01 07:29:54
【问题描述】:

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

约束

  • 使用 .Net 内置的 Trace 日志记录
  • 不属于某个庞大库的独立类或二进制文件
  • 允许根据大小滚动日志文件

【问题讨论】:

    标签: .net logging


    【解决方案1】:

    您可以使用 .NET Framework 内置的Microsoft.VisualBasic.Logging.FileLogTraceListener。不要让命名空间中的 VisualBasic 吓到您,您只需引用 microsoft.visualbasic.dll 程序集,它应该可以在 C# 中正常工作。

    【讨论】:

    • 通过 Google 找到这个线程...感谢 csgero 指出内置选项...查看 FileLogTraceListener 的文档,听起来很完美,无需部署第 3 方程序集。作为一名 C# 程序员,我什至不知道 Microsoft.VisualBasic 命名空间。
    • FileLogTraceListener,即基本的 .NET 框架,涵盖了您需要的内容。如果您需要更高级的侦听器选项,请查看基本诊断扩展 (essentialdiagnostics.codeplex.com)
    • FileLogTraceListener 不能用作“翻转日志文件”。它只能每天创建一个新文件,例如,当日志文件太大时,它会跳过写入新消息。
    • 我们刚刚遇到了这个“跳过写入”问题 - 解决方法是将 DiskSpaceExhaustedBehavior 设置为 ThrowException 而不是 DiscardMessages。然后当你得到异常时,将监听器设置为 Append = false,然后写入一个日志事件以创建一个新文件,然后将 Append 设置回 true。唯一的问题是这会删除旧的日志文件,而不是重命名它...
    • 我们被以下事实所困扰:事实上,这并不是“[允许]根据大小滚动日志文件”
    【解决方案2】:

    每当我需要进行网络跟踪时,我都会将这个配置 sn-p 放在手边。我不必通过在运行时在 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>
    

    【讨论】:

      【解决方案3】:

      我是 log4net (http://logging.apache.org/log4net/index.html) 的忠实粉丝,它非常易于配置并且支持几乎任何您想要的日志类型,但也可以编写自定义日志类型。

      它还可以根据日志级别执行不同的操作。我们将所有消息记录到文本文件和错误 -> 致命发送电子邮件

      【讨论】:

      • 问题是我更喜欢使用集成的 .Net 跟踪日志
      • 然后查看其中的 TraceAppender,它会记录到应用程序的跟踪中
      • TraceAppender 允许您将 log4net 跟踪重定向到框架(并且做了一个非常基本的 Trace.Write 所以没有级别、过滤、事件 ID 等,基本上是一个非常垃圾的工作)。但是,如果您已经在使用 .NET Framework 进行跟踪(即 traceSource.TraceEvent()),那么它没有帮助,或者对 WCF、WIF 或如果您打开任何其他框架跟踪没有帮助。
      【解决方案4】:

      我正在使用NLog,我非常满意。源代码写得很好,很容易扩展和修改。 文档很好,很容易配置。

      一些链接:

      【讨论】:

        【解决方案5】:

        FileLogTraceListener 是一个常见的建议,但它会在文件超过给定的最大大小时丢弃事件或抛出异常。

        我们创建了一个扩展它的类,并覆盖了 Write/WriteLine 方法。

        有一个 try/catch (InvalidOperationException),如果发生这种情况,我们调用 base.Close 并将文件 (FullLogFileName) 重命名如下(我们需要 base.Close 否则我们将收到“文件正在使用”错误):

        在循环中,我们在末尾添加一个数字,并查看该文件是否存在;如果没有,请使用File.Move(FullLogFileName, newFileWithNumber),否则我们会不断增加数字,直到找到有效的文件名。还有一个锁来确保给定的实例是线程安全的。

        【讨论】:

          【解决方案6】:

          我使用过 Log4Net 和 Nlog。我更喜欢 NLog,但实际上一旦设置好它们,你就会忘记它们在那里(直到有东西坏了,然后你很高兴它在那里!)。互联网上应该有大量关于这两个方面的文档

          【讨论】:

            【解决方案7】:

            考虑Enterprise Library Logging Application Block

            确保只安装 Logging 块,因为 EntLib 安装程序默认检查所有块。

            【讨论】:

            • EntLib 日志记录应用程序块配置复杂、速度慢,并且在某些情况下比基本 System.Diagnostics 功能更少!
            【解决方案8】:

            在其中一个 cmets 中给出:

            FileLogTraceListener Class

            写入滚动文本文件。

            备注

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

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

            【讨论】:

              【解决方案9】:

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

              派生自 TextWriterTraceListener,它添加成员以获得最大日志大小、要保留的最大滚动数,并使用共享和访问设置为 ReadWrite 并设置 OpenOrCreate 的 FileStream。它还应该创建并持有一个基于文件名的互斥锁。

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

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

              【讨论】:

                猜你喜欢
                • 2019-10-02
                • 1970-01-01
                • 2017-09-24
                • 1970-01-01
                • 2011-04-01
                • 1970-01-01
                • 2010-10-26
                • 2010-10-23
                • 1970-01-01
                相关资源
                最近更新 更多