log4Net 的问题
使用Log4net框架的时候:
   ILog log = LogManager.GetLogger(this.GetType());
   log.Debug("This is a Test");
   然后在配置文件中配置 %M或者%method 就可以记录 出现问题的方法名称。
   有谁分析过log4Net的源代码,这个method的名字是怎么获取的呢?
   我跟踪了一下。
   protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
     {
         writer.Write(loggingEvent.LocationInformation.MethodName);
     }
   然后继续是
LocationInfo这个类,关键的代码是:
  StackTrace trace = new StackTrace(true);
                 int index = 0;
                 while (index < trace.FrameCount)
                 {
                     StackFrame frame = trace.GetFrame(index);
                     if ((frame != null) && (frame.GetMethod().DeclaringType == callerStackBoundaryDeclaringType))
                     {
                         break;
                     }
                     index++;
                 }
                 while (index < trace.FrameCount)
                 {
                     StackFrame frame2 = trace.GetFrame(index);
                     if ((frame2 != null) && (frame2.GetMethod().DeclaringType != callerStackBoundaryDeclaringType))
                     {
                         break;
                     }
                     index++;
                 }
                 if (index < trace.FrameCount)
                 {
                     StackFrame frame3 = trace.GetFrame(index);
                     if (frame3 != null)
                     {
                         MethodBase method = frame3.GetMethod();
                         if (method != null)
                         {
                             this.m_methodName = method.Name;
                             if (method.DeclaringType != null)
                             {
                                 this.m_className = method.DeclaringType.FullName;
                             }
                         }
                         this.m_fileName = frame3.GetFileName();
                         this.m_lineNumber = frame3.GetFileLineNumber().ToString(NumberFormatInfo.InvariantInfo);
                         this.m_fullInfo = string.Concat(new object[] { this.m_className, '.', this.m_methodName, '(', this.m_fileName, ':', this.m_lineNumber, ')' });
就是this.m_methodName ,但是我拷贝出来以后,得到的结果是不一样的。高手们帮忙看一下。
其中GetInfo是我自己写的代码
         private void button4_Click(object sender, EventArgs e)
         {
             MessageBox.Show(MyLog.GetInfo(this.GetType()));
         }
我本来想得到 button_Click 这个字符串,结果得到的是OnClick
------解决方案--------------------http://blog.csdn.net/fangxinggood/archive/2007/02/25/1514291.aspx
其实关键是:
  Dim st As StackTrace = New StackTrace()
  Dim sf As StackFrame = st.GetFrame(2)
这个 2 表示从该代码开始被调用的层次。
你用下面代码:Message出来的就是“button4_Click”
C# code
  private   void   button4_Click(object   sender,   EventArgs   e) 
  { 
     StatckTrace st = new StackTrace();
     StackFrame sf = st.GetFrame(1);
     MessageBox.Show(sf.GetMethod().DeclaringType.Name);     
  }
------解决方案--------------------
看了lz的代码,估计是你没有很好的理解StackFrame,所以你简单的copy别人的代码出错可以理解。你需要的层数和别人使用的层数是不一样的,所以你拿到的不是你想要的东西。
楼上的改法就是正解。