通过对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