TraceSource锁定文件

时间:2015-03-27 17:05:28

标签: c# .net tracesource

我有一个课程的实例,可以存在很长时间(数小时到数月)。它有一个将日志事件输出到文本文件C:\mylog.txt的方法。如下

public MyClass
{
    private static System.Diagnostics.TraceSource traceSource = new System.Diagnostics.TraceSource("My.Source");

    private static void MyMethod()
    {
        traceSource.TraceEvent(System.Diagnostics.TraceEventType.Information, 0, "MyMethod called.");
    }
}

C:\mylog.txt可能会变得非常大,我想删除它。但我无法删除该文件,因为它被traceSource锁定(通过终止我可以删除文件的过程)。

System.Diagnostics.TraceSource的所有示例都将其实例声明为上面的静态类成员。鉴于我的情况,可以接受在下面的方法中初始化它吗?

public MyClass
{
    private static void MyMethod()
    {
        var traceSource = new System.Diagnostics.TraceSource("My.Source");
        traceSource.TraceEvent(System.Diagnostics.TraceEventType.Information, 0, "MyMethod called.");
    }
}

或者是否有必须声明为静态的特定原因?难道我做错了什么?文件是否锁定了预期/必需的行为?

1 个答案:

答案 0 :(得分:6)

你正在寻找铁轨的错误方面来解决这个问题。 TraceSource不确定如何记录跟踪数据。这是由.NET中的另一个类(TraceListener)完成的。两者之间的区分非常重要,跟踪源只是一个有趣的跟踪信息来源,监听器确切地确定如何过滤不太重要的信息及其记录方式。

关于如何配置监听器的问题没有任何见解。使用.config文件是一种常见的方式。

你需要一种不同类型的倾听者。一个非常简单的会在需要记录跟踪事件时打开日志文件,并在写入字符串后立即再次关闭它。这使您可以轻松删除文件,尽管您必须在恰当的时间完成此操作。然而,这不是正确的方式,效率非常低。

一个常见的解决方案是“滚动appender”,一个将日志信息记录到文件中但确保不会太大的监听器。然后切换到另一个文件并删除非常旧的文件,这样你就不会得到太多的文件。不是您想要自己编写的代码,它可以从库中轻松获得。你可以通过Nuget得到的那种。我推荐NLog,基于流行的Apache Log4Net库,但更多的是以.NET为中心。 This question涵盖了它。