0

我目前非常需要现有应用程序的日志记录,并且无法将我期望的日志记录级别直接添加到代码中。作为一种解决方法,我很乐意在每次触发事件时完成一定数量的日志记录。

我正在考虑一个解决方案,我可以在运行时解析整个应用程序以使用事件到包装器到处理程序来包装所有事件到处理程序的绑定;并且,理想情况下,也可以在运行时解开它们。在伪代码中,这将是:

IDictionary<Event, Action<object, EventArgs>) originalBindings = ...;

public void SetWrapBindings()
{
   var allBindingsToReplace = Assembly.GetAssembly().GETALLEVENTS()
      .Where(eventInfo => eventInfo.GetOtherMethods().Any());

   foreach(var binding in allBindingsToReplace)
   {
     binding.event -= binding.handler;
     binding.event += HandlerWrapper;
     originalBindings.Add(binding.event, binding.handler);
   }

}

public static void HandlerWrapper(object o, EventArgs e)
{
    // Do some logging
    try
    {
       var handler = originalBindings.TryGetValue(/* something */);
       handler.Invoke(o, e);
    }
    // Do more logging
}

在这一堆伪代码中,有很多步骤我无法编写,可能是因为我没有找到正确的 API 用法,但也可能是因为其中的某些操作在理论上是不可能的(在这种情况下我会喜欢知道为什么)。这些是:

  • 迭代应用程序的所有事件(这可能很容易)
  • 为我的字典识别一个好的键
  • 在每一步,从上下文中获取相关信息

当然,将一个额外的处理程序绑定到每个现有事件(执行前/后执行例程而不真正包装处理程序)会有所帮助,但是在 try-catch 中执行真正的处理程序是一件好事。

任何部分答案仍然非常感谢

4

1 回答 1

1

如果您正在寻找非侵入式系统范围的日志记录,最好使用PostSharp等面向方面的编程框架。 此页面为您正在寻找的内容提供了一个不错的起点。

编辑: 要添加到这一点,看看实现一个EventInterceptionAspect如果你真的只是想知道什么时候引发任何事件。同样,PostSharp 博客是一个很好的信息来源,本文展示了这个方面的实现,它执行简单的标准输出日志记录,包括添加、删除和调用。

于 2012-11-14T23:39:40.410 回答