2017-04-20 83 views
1

我想使用Elmah将来自多个客户的ASP.net Web窗体应用程序的错误记录到中央错误数据库,每个错误记录了一个唯一的应用程序名称。Elmah应用程序名称配置

我意识到这可以很容易地设置在web.config中的elmah.errorLog.applicationName属性,但我们所有的客户都有标准的web.config文件,以供参考configSource在appSettings.config和connectionStrings.config文件的每个系统的独特设置或web.config中的file属性。

由于在web.config中不允许使用fileconfigSourceelmahsectionGroup,我怎么可以设置为applicationName唯一ELMAH每个系统?

我不想以编程方式在web.config中设置属性,因为将来可能会在web.config被覆盖时丢失它。

我尝试设置Global.asax.Application_Start()中的ErrorLog.ApplicationName属性,就像这样,但我设置的值被忽略。

Dim logger As Elmah.ErrorLog = Elmah.ErrorLog.GetDefault(Nothing) 
logger.ApplicationName = "Testing 123" 

任何意见,将不胜感激,因为ELMAH符合我们所有的需求,我们只需要能够唯一标识在中央错误数据库日志中的错误。

+0

你会处理这就像在网页别的。每个部署更改的配置,例如连接字符串或API密钥。只需将它作为部署过程的一部分(您确实拥有了自动化权限?),以便为该部署插入正确的详细信息。 – mason

+0

现有的网站发布服务已经在内部开发,但它目前无法自定义每个站点的web.config,并且将所有内容都放到外部配置文件中的目的是让我们有一个共同的网站.config在每个站点上。 – Ted

+0

那么,您可以随时修改您的工具和流程以满足您的需求。这就是拥有一个内部工具的关键所在?准确定制您的需求?无论如何,当你试图将Elmah配置文件移动到单独的文件时发生了什么?什么阻止了你?即使这不是[Elmah,它是开源的](https://github.com/elmah/Elmah)目前不可能实现的。您可以修改以符合您的需求,或者提交PR/Issue以添加新功能。 – mason

回答

0

察觉this SO post后,我现在已经成功地建立外部配置文件ELMAH。

web.configelmah部分看起来像这样:

<elmah> 
     <errorLog configSource="Config\Elmah\elmahErrorLog.config" />   
     <errorMail configSource="Config\Elmah\elmahErrorMail.config" /> 
     <errorFilter configSource="Config\Elmah\elmahErrorFilter.config" />   
     <security allowRemoteAccess="false" /> 
    </elmah> 

其内容如下; elmahErrorLog.config:

<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="ErrorLog" applicationName="My Unique Application Name" /> 

elmahErrorFilter.config(这个配置可以防止电子邮件通知本地主机请求):

<errorFilter> 
    <test> 
    <and> 
     <equal binding="Context.Request.IsLocal" value="True" type="Boolean" /> 
     <regex binding="FilterSourceType.Name" pattern="mail" /> 
    </and> 
    </test> 
</errorFilter> 

elmahErrorMail.config

<errorMail from="foo" 
      to="foo" 
      subject="My Exception - {0}" 
      async="false"   
      smtpServer="foo" 
      userName="foo" 
      password="foo"> 
</errorMail> 
1

如果您的部署系统允许为每个客户设置单独的应用程序设置,则可以在ELMAH中使用错误过滤来从应用程序设置中使用应用程序名称来丰富所有错误。看看这个博客文章的详细信息:Enrich ELMAH errors using error filtering hook

总之,您关闭所有错误和记录一个新的错误,包括从配置的应用程序名称:

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs args) 
{ 
    var httpContext = args.Context as HttpContext; 
    if (httpContext != null) 
    { 
     var error = new Error(args.Exception, httpContext); 
     error.ApplicationName = ConfigurationManager.AppSettings["AppName"]; 
     ErrorLog.GetDefault(httpContext).Log(error); 
     args.Dismiss(); 
    } 
} 
+0

这看起来非常有用,谢谢托马斯。但是,在这里设置ApplicationName时,它会添加到AllXml数据中,但应用程序字段本身未设置。有没有办法更新这个字段?另外,有没有办法在这里添加自定义数据到错误?非常感谢! – Ted

+0

你说得对,我只是试了一下。应用程序名称不能被设置为唯一属性:(我认为唯一的选择是从代码配置ELMAH。下面是一个用elmah.io实现的例子,但是用你的日志代替Elmah.Io.ErrorLog使用:https://docs.elmah.io/configure-elmah-io-from-code/。创建字典时,添加一个名为applicationName的键值来自应用程序设置值,这应该会有效。 – ThomasArdal