.NET的最佳滚动日志文件tracelistener是什么

.NET的最佳滚动日志文件tracelistener是什么,.net,logging,.net,Logging,我正在寻找一个好的.Net TraceListener,它支持根据大小限制滚动日志文件 约束 使用.Net内置跟踪日志记录 独立类或二进制文件,它们不是某个大型库的一部分 允许根据大小滚动日志文件 我是log4net()的忠实粉丝,它很容易配置并支持您想要的任何日志类型,但也可以编写自定义日志类型 它还可以根据日志级别执行不同的操作。我们将所有信息都记录到一个文本文件中,然后错误->致命发送电子邮件我正在使用,我非常满意。源代码编写良好,易于扩展和修改。 文档很好,很容易配置 一些链接:

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

约束

  • 使用.Net内置跟踪日志记录
  • 独立类或二进制文件,它们不是某个大型库的一部分
  • 允许根据大小滚动日志文件
我是log4net()的忠实粉丝,它很容易配置并支持您想要的任何日志类型,但也可以编写自定义日志类型

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

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

一些链接:


我同时使用了Log4Net和Nlog。我更喜欢NLog,但一旦它们设置好了,你就忘了它们在那里了(直到有东西坏了,你才高兴它在那里!)。您可以使用的interweb中应该有大量关于这两个方面的文档,

,它是.NET Framework内置的。不要让名称空间中的VisualBasic吓到您,您只需引用microsoft.VisualBasic.dll程序集,它应该可以与C#一起工作。

请考虑


确保只安装日志记录块,因为EntLib安装程序默认检查所有块。

如其中一条注释所示:

写入滚动文本文件

评论

当达到maxFileSize时,将使用新文件以及每日 或logFileCreationSchedule规定的每周

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


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

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

我们创建了一个类来扩展它,并重写Write/WriteLine方法

有一个
try/catch(invalidooperationexception)
,如果发生这种情况,我们将调用
base.Close
并将文件重命名(
FullLogFileName
),如下所示(我们需要
base.Close
,否则我们将得到一个“file in use”错误):


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

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

从TextWriterTraceListener派生,该Listener为最大日志大小、要保留的最大卷数添加成员,并使用共享和访问设置为ReadWrite和设置OpenOrCreate的文件流。它还应该创建并保存一个名称基于文件名的互斥锁

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


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

问题是我更喜欢使用集成的.Net跟踪日志,然后检查其中的TraceAppender,它将记录到appTraceAppender的跟踪,允许您将log4net跟踪重定向到框架(并且做了一个非常基本的跟踪。没有级别、过滤、事件ID等,基本上是一个非常糟糕的工作)。但是,如果您已经在使用.NET Framework进行跟踪(即traceSource.TraceeEvent())如果你打开任何其他框架跟踪,它都不会有任何帮助。通过Google找到这个线程…感谢csgero指出内置选项…查看FileLogTraceListener的文档,它听起来很完美,而且不需要部署第三方程序集。作为一名C#程序员,我甚至不知道Microsoft.VisualBasic namespace.FileLogTraceListener,即基本的.NET框架,涵盖了您需要的内容。如果您想要更高级的侦听器选项,请查看基本诊断扩展()FileLogTraceListener不能作为“滚动日志文件”使用。例如,它只能每天创建一个新文件,或者在日志文件太大时跳过写入新消息。我们只是遇到了这个“跳过写入”问题-解决方法是将DiskSpaceExpustedBehavior设置为ThroweException,而不是DiscardMessages。然后,当出现异常时,将侦听器设置为Append=false,然后写入一个日志事件若要创建一个新文件,请将Append设置回true。唯一的问题是,这会删除旧日志文件,而不是重命名它……事实上,这并没有“允许根据大小滚动日志文件”EntLib日志记录应用程序块配置复杂,速度慢,功能不如基本系统。某些情况下需要诊断!