通過對Elmah源代碼進行一些更改,您可以讓所有網站都寫入同一個數據庫。然後,您可以配置一個主控程序,以便將所有例外情況與投放它的應用程序一起顯示。
埃裏克國王展示瞭如何在這篇博客http://blog.devadept.com/2010/02/using-elmah-with-multiple-applications.html
總結:
創建一個名爲ELMAH_GetErrorsXML_Master和ELMAH_GetErrorXML_Master沒有的applicationName參數數據庫兩個額外的存儲過程。
然後根據現有的'SQLErrorLog.cs'類創建一個SQLMasterErrorLog類。在此編輯GetErrorXml()和GetErrorsXML()方法來調用新的存儲過程
public static SqlCommand GetErrorXml(string appName, Guid id)
{
SqlCommand command = new SqlCommand("ELMAH_GetErrorXml_Master");
command.CommandType = CommandType.StoredProcedure;
SqlParameterCollection parameters = command.Parameters;
parameters.Add("@ErrorId", SqlDbType.UniqueIdentifier).Value = id;
return command;
}
public static SqlCommand GetErrorsXml(string appName, int pageIndex, int pageSize)
{
SqlCommand command = new SqlCommand("ELMAH_GetErrorsXml_Master");
command.CommandType = CommandType.StoredProcedure;
SqlParameterCollection parameters = command.Parameters;
parameters.Add("@PageIndex", SqlDbType.Int).Value = pageIndex;
parameters.Add("@PageSize", SqlDbType.Int).Value = pageSize;
parameters.Add("@TotalCount", SqlDbType.Int).Direction = ParameterDirection.Output;
return command;
}
變化在ErrorLogPage類RendorErrors()方法的應用程序名稱顯示在日誌查看器表中的一個額外的列。
添加以下表頭
headRow.Cells.Add(FormatCell(new TableHeaderCell(), "Host", "host-col"));
headRow.Cells.Add(FormatCell(new TableHeaderCell(), "App", "app-col"));
而且在創建childrows
bodyRow.Cells.Add(FormatCell(new TableCell(), error.HostName, "host-col"));
bodyRow.Cells.Add(FormatCell(new TableCell(), error.ApplicationName, "app-col"));
下面的for循環現在,所有你需要的是一個空的網站,有ELMAH配置。而不是正常的SqlErrorLog使用以下
<errorLog type="Elmah.SqlMasterErrorLog, Elmah" connectionStringName="elmah"/>
這很好,但斷開連接就是我們想要的 - 我們沒有將所有網站都放在同一個虛擬主機中,因此不能將所有內容寫入單個數據庫,因爲它不能集中在一起 - 因此我的想法與谷歌閱讀器 – Doug 2011-03-11 00:15:04
在這種情況下,我會創建一個基於接受ftp信息的XmlFileErrorLog的類。您可以將所有xml文件發送到本地網絡中的單個服務器,並使用上面發佈的相同渲染更改。 – 2011-03-11 09:14:49