.NET的最佳滚动日志文件tracelistener是什么
我正在寻找一个好的.Net TraceListener,它支持根据大小限制滚动日志文件 约束.NET的最佳滚动日志文件tracelistener是什么,.net,logging,.net,Logging,我正在寻找一个好的.Net TraceListener,它支持根据大小限制滚动日志文件 约束 使用.Net内置跟踪日志记录 独立类或二进制文件,它们不是某个大型库的一部分 允许根据大小滚动日志文件 我是log4net()的忠实粉丝,它很容易配置并支持您想要的任何日志类型,但也可以编写自定义日志类型 它还可以根据日志级别执行不同的操作。我们将所有信息都记录到一个文本文件中,然后错误->致命发送电子邮件我正在使用,我非常满意。源代码编写良好,易于扩展和修改。 文档很好,很容易配置 一些链接:
- 使用.Net内置跟踪日志记录
- 独立类或二进制文件,它们不是某个大型库的一部分
- 允许根据大小滚动日志文件
确保只安装日志记录块,因为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日志记录应用程序块配置复杂,速度慢,功能不如基本系统。某些情况下需要诊断!