C# 带有企业应用程序块的自定义跟踪侦听器
我目前正在从事的项目使用企业库V3.1框架进行日志记录 我需要获取生成的日志文件,并在特定点将其归档。内置跟踪侦听器似乎在日志记录事件之间保持文件打开。我已经设置了一个自定义跟踪侦听器,它将附加到一个文件并将其关闭,以便该文件始终是可移动的 看起来是这样的(为了清楚起见,减去错误处理): 这很好,但我更愿意以某种方式将路径作为参数传递,而不是对其进行硬编码 为了好玩,我尝试将其添加到构造函数中,看看会发生什么:C# 带有企业应用程序块的自定义跟踪侦听器,c#,logging,enterprise-library,C#,Logging,Enterprise Library,我目前正在从事的项目使用企业库V3.1框架进行日志记录 我需要获取生成的日志文件,并在特定点将其归档。内置跟踪侦听器似乎在日志记录事件之间保持文件打开。我已经设置了一个自定义跟踪侦听器,它将附加到一个文件并将其关闭,以便该文件始终是可移动的 看起来是这样的(为了清楚起见,减去错误处理): 这很好,但我更愿意以某种方式将路径作为参数传递,而不是对其进行硬编码 为了好玩,我尝试将其添加到构造函数中,看看会发生什么: public LogFolderTraceListener(string l
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:TraceListenerAssembler
- 还有另一个类
,它似乎可以使SystemDiagnosticsTraceListenerNode:TraceListenerNode
类呈现给配置应用程序数据
我的问题是:如何使用可配置参数
path
创建CustomTraceListener
?我怀疑企业应用程序可能会阻塞,尽管(可能)很好,看起来不必要的复杂,最终比这种定制的价值更麻烦。因为它的价值,这就是我如何实现它的。在我的this.buildCurrPath()中,我可以从配置文件中读取,或者在本例中,我只需要获取web应用程序的“启动板”。但对我来说效果很好。我还没有把它放到任何生产代码中,但它应该很快就会推出
[ConfigurationElementType(typeof(CustomTraceListenerData))]
public class CustomListener: CustomTraceListener
{
#region Fields (3)
private int logSize;
StreamWriter sw;
#endregion Fields
#region Constructors (1)
public CustomListener ():base()
{
string startPath = this.buildCurrPath();
sw = new StreamWriter(startPath + "\\Logs\\test.log");
sw.AutoFlush = true;
}
这是典型的微软问题。。(在此处添加您自己的形容词) 1) 添加自定义跟踪侦听器时,添加的'raw'app.config语句为:
name="Custom Trace Listener" initializeData="" formatter="Text Formatter" />
2) 请注意'initializeData'-这就是神秘的错误消息所调用的'InitData'
3) 所以它的意思是,您需要一个接受初始化数据的构造函数——用vb的说法:
sub new (byval initstuff as string)
4) 或删除“initializeData=”“”并使用默认构造函数:
sub new()
我怀疑p&p的人生活在泡沫中。
riix.CustomTraceListener源于TraceListener,它有一个名为Attributes的StringDictionary 这将包含TraceListener配置行中的所有属性,并且可以通过名称获取,例如
string logFileName= Attributes["fileName"]
我刚刚遇到了同样的问题(企业库v4.1除外) 我找到的解决方案是删除默认构造函数,并且只有一个带有字符串参数的构造函数作为文件名,即
public AlwaysClosedTextFileTraceListener(字符串路径参数)
{
logFilePath=pathParameter;
}
然后在app.config中,将路径放入initializeData
参数中
虽然Entriprise Library configuration editor无法识别这一点,也没有它可能的那么整洁,但只要只有一个参数,它就可以工作
如果有人想出了正确的方法,请发布并让我们知道-当然,这不应该这么难。@John-你说得完全正确,我只是添加了它,因为我怀疑这是事实,为什么没有太多答案。现在它开始得到更多的答案,所以希望不是:)…但不幸的是,我也觉得这是一种真实的情绪。我仍然使用它,因为我喜欢这个挑战。属性只有在对象构建完成后才可用,你不能在构造函数中使用它们。
string logFileName= Attributes["fileName"]