我目前正在开发的项目使用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"]