通过对 Elmah 源代码进行一些更改,您可以让所有站点写入同一个数据库。然后,您可以配置一个主站点来显示所有异常以及引发异常的应用程序。
Eric King 在这篇博文中展示了如何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"));
以及创建子行的 for 循环中的以下内容
bodyRow.Cells.Add(FormatCell(new TableCell(), error.HostName, "host-col"));
bodyRow.Cells.Add(FormatCell(new TableCell(), error.ApplicationName, "app-col"));
现在您只需要一个配置了 elmah 的空网站。而不是正常的 SqlErrorLog 使用以下
<errorLog type="Elmah.SqlMasterErrorLog, Elmah" connectionStringName="elmah"/>