我目前从事的项目使用 Enterprise Libraries V3.1 框架进行日志记录。

我需要获取生成的日志文件并在特定点将其存档。内置的跟踪监听器似乎在日志事件之间保持文件打开。我已经设置了一个自定义跟踪监听器,它将附加到一个文件并关闭它,以便该文件始终是可移动的。

它看起来像这样(为了清楚起见,减去错误处理):

[ConfigurationElementType(typeof(CustomTraceListenerData))]
public class AlwaysClosedTextFileTraceListener : CustomTraceListener
{
    private string logFilePath;

    public AlwaysClosedTextFileTraceListener ()
    {
        logFilePath = @"hardcodedpath\log.txt";
    }

    public override void Write(string message)
    {
        using (StreamWriter logFile = File.AppendText(logFilePath))
        {
            logFile.Write(message);
            logFile.Flush();
            logFile.Close();
        }
    }

    public override void WriteLine(string message)
    {
        using (StreamWriter logFile = File.AppendText(logFilePath))
        {
            logFile.WriteLine(message);
            logFile.Flush();
        }
    }

    public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
    {
        if (data is LogEntry && this.Formatter != null)
        {
            WriteLine(this.Formatter.Format(data as LogEntry));
        }
        else
        {
            WriteLine(data.ToString());
        }
    }
}

这工作正常,但我更愿意以某种方式将路径作为参数传递,而不是对其进行硬编码。

为了好玩,我尝试将它添加到构造函数中,看看会发生什么:
    public LogFolderTraceListener(string logFilePath)
    {
        this.logFilePath = logFilePath;
    }

当我这样做时,我收到一条错误消息,提示我做错了什么:
System.InvalidOperationException : The type 'AlwaysClosedTextFileTraceListener' specified for custom trace listener named 'MyLogFile' does not a default constructor, which is required when no InitData is specified in the configuration.

从现在开始,我的调查已经非常接近,死胡同的对立面,无限概率问题。

我发现这个翻阅内置 RollingTraceListener 的源代码
  • 有一个类 RollingFlatFileTraceListenerData : TraceListenerData,它似乎包含传递给构造函数
  • 的所有设置
  • RollingFlatFileTraceListenerData 文件的底部露营的是 RollingTraceListenerAssembler : TraceListenerAsssembler 类,它似乎是一个工厂
  • 还有另一个类 SystemDiagnosticsTraceListenerNode : TraceListenerNode 似乎使 Data 类可呈现给配置应用程序

  • 我的问题是:如何使用 CustomTraceListener 的可配置参数创建 path

    最佳答案

    CustomTraceListener 派生自 TraceListener,它有一个名为 Attributes 的 StringDictionary。

    这将包含 TraceListener 配置行中的所有属性,并且可以通过名称获取,例如。

    string logFileName= Attributes["fileName"]
    

    关于c# - 带有企业应用程序块的自定义跟踪监听器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/530385/

    10-11 15:52