我目前从事的项目使用 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/