TraceSource锁定文件

4

我有一个类的实例,它存在很长时间(几个小时到几个月)。它有一个方法将日志事件输出到文本文件 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.");
    }
}

还是有特定的原因需要将它声明为静态的吗?我做错了什么吗?文件锁定是期望/必须的行为吗?


也许您还可以展示一下您的.config文件中相关的设置? - Vojtěch Dohnal
1个回答

6
您正在看错铁路轨道的这个问题。TraceSource并不确定如何记录跟踪数据。这是由.NET中的另一个类TraceListener完成的。两者之间的区别很重要,跟踪源只是跟踪信息的有趣来源,侦听器确定了如何过滤较不重要的信息以及如何记录它。
从问题中无法得出您如何配置侦听器的见解。使用.config文件是一种常见的方法。
您需要一种不同类型的侦听器。一个非常简单的侦听器将在需要记录跟踪事件时打开日志文件,并在写入字符串后立即关闭它。这使您有机会删除文件,尽管您仍然必须在恰当的时间进行操作。但这不是正确的方式,效率非常低下。
一种常见的解决方案是“滚动记录器”,它是一个监听器,将日志信息记录到文件中,但确保文件大小不会过大。然后切换到另一个文件并删除非常旧的文件,以便您不会得到太多文件。这不是您想自己编写的代码,它可以从库中轻松获取。我建议使用NLog,它基于流行的Apache Log4Net库,但更加.NET中心化。这个问题涵盖了它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接