2011-03-01 75 views
4

在我的作品中,我们制作的网站像他们走出去的方式(即大量每年网站)你如何集中ELMAH记录

我想所有的这些安装ELMAH作为公司的做法,然后登录我们的开发人员可以集中观看所有内容该过程必须非常简单,否则其使用不会起飞。

我正在考虑建立一个中央的Google阅读器帐户,并将ELMAH安装的所有RSS源连接到它。

我担心Google说他们每小时只检查一次,这意味着如果您使用ELMAH的“内存”存储,那么在应用程序池重新启动时,错误可能会丢失。

电子邮件是相当不错的,但如果每个人都开始接受ELMAH错误消息,他们将开始忽略它们 - 也许我可以设置一个额外的交换邮箱只是为了让这东西分开?

您的想法将不胜感激

(PS这可以被认为是主观的 - 但我认为,有人可能有中一些主观的答案的答案,使之成为一个有效的问题)

回答

7

通过对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"/> 
+1

这很好,但断开连接就是我们想要的 - 我们没有将所有网站都放在同一个虚拟主机中,因此不能将所有内容写入单个数据库,因为它不能集中在一起 - 因此我的想法与谷歌阅读器 – Doug 2011-03-11 00:15:04

+2

在这种情况下,我会创建一个基于接受ftp信息的XmlFileErrorLog的类。您可以将所有xml文件发送到本地网络中的单个服务器,并使用上面发布的相同渲染更改。 – 2011-03-11 09:14:49

1

我用ftp方法转移的所有错误XML(网站,B,C ...)的收集所有网站的错误XML(日志网站)。

Global.asax Application_Start

添加ElmahErrorLogCustomize任务每10分钟到所有的XML所有XML传输到日志网站,转让后的网站(A,B,C ...),并在网站上删除这些记录(A,B,C ...)