我经常对我必须包含在我的代码中的日志记录数量感到沮丧,这让我想知道是否有更好的做事方式.
我不知道这是否已经完成或是否有人提出了更好的想法,但我想知道是否有人知道将"记录器""注入"应用程序,以便被动地监视线程并安静地记录日志流程发生时不必执行以下操作:
public void MyProcess(int a, string b, object c) { log( String.Format( "Entering process MyProcess with arguments: [a] = [{0}]; [b] = [{1}]; [c] = [{2}]", a.ToString(), b, c.ToString() ); try { int d = DoStuff(a) log( String.Format( "DoStuff({0}) returned value {1}", a.ToString(), d.ToString() ) ); } catch (Exception ex) { log( String.Format("An exception occurred during process DoStuff({0})\nException:\n{1}", a.ToString(), ex.ToString()) ) } }
如果我可以对我的记录器说:
Monitor(MyClass.MyMethod)
然后它将监视该方法内部的所有内容,包括传入参数以及方法调用和传递给这些方法的值,发生的异常等.
过去有没有人实现这样的东西?甚至可以实施吗?以这种方式登录只是一个梦想?
我喜欢设计能做到这一点的东西,但我甚至不知道我会从哪里开始.当然,我也不想重新发明轮子,如果它已经完成了,如果有人能指出我正确的方向,那就太好了.
任何建议都会感激不尽......
编辑:我想我会回答一个问题,询问日志中所需的详细程度.通常需要提供可配置级别的日志记录,以便如果配置指定详细日志记录,则记录所有内容,而如果配置了关键日志记录,则仅记录某些信息以及异常.如果配置了致命日志记录,则仅记录导致应用程序死亡的信息.这样的东西是可配置的还是AOP需要3或4个不同的构建,具体取决于日志记录级别的数量?
我经常使用4个级别:致命,严重,信息,详细
您可以使用PostSharp来记录该方法的"周围".这正是AOP擅长的事情.您可能希望从Log4PostSharp开始- 一个专门用于日志记录的插件.