利用Trace.WriteLine定位難以重現的問題


最近的一個項目中,在客戶測試環境(UAT)發現了一個bug,卻反復嘗試都無法在開發環境和QA環境來重現。界面上也沒有出現任何異常和錯誤,只是某個數據的顯示錯誤,其他數據都正常。仔細分析和調試了出錯位置的上下文代碼,沒有任何異常和疑點。由於是C/S結構(WPF),而技術人員也無法到達客戶現場進行協助,所以半天都沒有任何進展。

后來突然想到了用Trace.WriteLine輸出日志的方法,在征得領導同意和取得客戶的協助意願之后,按下面的步驟來實施,最終根據日志分析找到了問題原因:

  1. 在出現bug的相關上下文代碼中加入Trace.WriteLine方法,記錄下可疑的數據和狀態;
  2. 新建一個單獨的dll工程,里面要求實現接口TraceListener,重寫WriteLine(或者Write)方法;
  3. 將生成的dll拷貝到系統啟動目錄下(與啟動exe文件平級);
  4. 修改系統配置文件(app.config),將輸出節點配置為剛才dll中的TraceListener實現類;
  5. 重新制作安裝包分發給客戶(或者讓程序自動更新);
  6. 讓客戶重新運行新版本程序,並重現一次bug;
  7. 讓客戶把指定位置下的日志文件發送過來進行分析。

 

配置文件相關節點如下:

<system.diagnostics>
    <trace>
      <listeners>
        <add name="SimpleLogTraceListener" type="TraceListenerApp.SimpleTraceListener, TraceListenerApp"/>
      </listeners>
    </trace>
  </system.diagnostics>

 

輸出日志的實現類代碼如下:

    /// <summary>
    /// A simple implementation for TraceListener to log the output to text file
    /// </summary>
    public class SimpleTraceListener : TraceListener
    {
        //default trace log file path
        string filepath = @"c:\temp\tracelog.txt";
        /// <summary>
        /// override the output from Trace.Write()
        /// </summary>
        /// <param name="message"></param>
        public override void Write(string message)
        {
            CheckLogFile();
            //format the message with datetime
            StringBuilder sb = new StringBuilder();
            sb.Append("[");
            sb.Append(DateTime.Now.ToString());
            sb.Append("]\t");
            sb.Append(message);
            using (StreamWriter sw = new StreamWriter(filepath, true))
            {
                sw.Write(sb.ToString());
                sw.Flush();
            }
        }

        /// <summary>
        /// override the output from Trace.WriteLine()
        /// </summary>
        /// <param name="message"></param>
        public override void WriteLine(string message)
        {
            CheckLogFile();
            //format the message with datetime
            StringBuilder sb = new StringBuilder();
            sb.Append("[");
            sb.Append(DateTime.Now.ToString());
            sb.Append("]\t");
            sb.Append(message);
            using (StreamWriter sw = new StreamWriter(filepath, true))
            {
                sw.WriteLine(sb.ToString());
                sw.Flush();
            }
        }

        //make sure the logfile is existing, if not, create a new one.
        void CheckLogFile()
        {
            if (!File.Exists(filepath))
            {
                try
                {
                    FileStream fs = File.Create(filepath);
                    fs.Close();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
    }

 

(完)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM