【问题标题】:TraceSource locking fileTraceSource 锁定文件
【发布时间】:2015-03-27 17:05:28
【问题描述】:

我有一个存在很长时间(数小时到数月)的类的实例。它有一种将日志事件输出到文本文件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 文件中显示相关设置?

标签: c# .net tracesource


【解决方案1】:

对于这个问题,您正在寻找错误的铁轨一侧。 TraceSource 不决定如何记录跟踪数据。这是由 .NET 中的 另一个 类 TraceListener 完成的。两者之间的划分很重要,trace source 只是一个有趣的跟踪信息来源,监听器确切地确定了如何过滤不太重要的信息以及如何记录它。

从您如何配置侦听器的问题中没有任何见解。使用 .config 文件是一种常见的方式。

您需要不同类型的听众。一个非常简单的方法是在需要记录跟踪事件时打开日志文件,并在写入字符串后立即将其关闭。这使您可以删除文件,尽管您仍然必须在正确的时间执行此操作。但这不是正确的方法,效率很低。

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

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 2021-03-29
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多