2011-03-19 43 views
1

我想爲我的MVC3應用程序設置一個基本控制器。我的其他控制器會繼承的東西。我想要做的是實現日誌記錄。我看到下面這個例子:帶日誌記錄的MVC baseController是什麼樣子的?

public class baseController : Controller 
{ 

    protected override void OnException(ExceptionContext filterContext) 
    { 
     filterContext.ExceptionHandled = true; 
     this.View("Error").ExecuteResult(this.ControllerContext); 
    } 

} 

但我不知道該記錄什麼以及如何記錄它。有人可以給我一些關於在基本控制器中處理錯誤的建議。我希望有人能幫幫忙。謝謝。

回答

0

如果你想記錄未處理的異常,你最好在應用程序級別處理它。 ELMAH是一個開始的好地方,或者只是使用內置的心跳處理。

就日誌記錄而言,最好的辦法是使用類似log4net的東西來處理細節。

2

好像您正在尋找某種基本級別的應用程序錯誤處理。爲什麼不在Global.asax文件中添加Application_Error方法的定義。這將捕獲任何未經處理的異常,在您的應用程序突然出現(從控制器或其他庫或意見等)

這裏的例子:添加到您的Global.asax:

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception exception = Server.GetLastError(); 
    Response.Clear(); 

    //Do your logging here. 
    //Redirect to an appropriate error page. 
} 

如果您想知道要記錄的內容,您可以在此方法內使用異常對象中的大量信息。我通常會寫一個將某些信息寫入文本文件的類。下面是一個例子(在一個名爲Log類) - 這不是最全面的方法,我相信更多的信息可以從異常對象中提取,但:

public class Log 
{ 
    private StreamWriter _writer; 

    public void WriteErrorMessage(string errorMessage, string pageUrl, Exception e) 
    { 
     _writer = new StreamWriter("LOG_FILE_OUTPUT_PATH_HERE.txt", true); 
     StringBuilder fullError = new StringBuilder(); 

     fullError.AppendLine("Error log: " + DateTime.Now); 
     fullError.AppendLine(errorMessage); 
     fullError.AppendLine("Error raised on: " + pageUrl); 
     fullError.AppendLine("Associated exception message: " + e.Message + "\n" + e.InnerException); 
     fullError.AppendLine("Exception class: " + e.GetType().ToString()); 
     fullError.AppendLine("Exception source: " + e.Source.ToString()); 
     fullError.AppendLine("Exception method: " + e.TargetSite.Name.ToString()); 
     fullError.AppendLine(); 
     _writer.WriteLine(fullError); 
     _writer.Flush(); 
     _writer.Close(); 
    } 
} 

然後,在你的Application_Error方法(即我們定義以上)只需致電:

new Log().WriteErrorMessage("Global error has occurred.", Request.Url.ToString(), exception); 
相關問題