Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有企业应用程序块的自定义跟踪侦听器_C#_Logging_Enterprise Library - Fatal编程技术网

C# 带有企业应用程序块的自定义跟踪侦听器

C# 带有企业应用程序块的自定义跟踪侦听器,c#,logging,enterprise-library,C#,Logging,Enterprise Library,我目前正在从事的项目使用企业库V3.1框架进行日志记录 我需要获取生成的日志文件,并在特定点将其归档。内置跟踪侦听器似乎在日志记录事件之间保持文件打开。我已经设置了一个自定义跟踪侦听器,它将附加到一个文件并将其关闭,以便该文件始终是可移动的 看起来是这样的(为了清楚起见,减去错误处理): 这很好,但我更愿意以某种方式将路径作为参数传递,而不是对其进行硬编码 为了好玩,我尝试将其添加到构造函数中,看看会发生什么: public LogFolderTraceListener(string l

我目前正在从事的项目使用企业库V3.1框架进行日志记录

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

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

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

为了好玩,我尝试将其添加到构造函数中,看看会发生什么:

    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"]