如何覆盖Web.config中设置的Elmah applicationname

时间:2017-04-11 15:19:57

标签: asp.net-mvc multi-tenant elmah

我们有一个多租户的MVC应用程序,意味着完全相同的应用程序发布到多个IIS虚拟目录/应用程序,然后应用程序自己解决它是谁,并相应地皮肤自我(css)。 / p>

这一切都很好,但ELMAH在我们的elmah数据库中记录的任何内容都记录在相同的applicationName下,因为这是从下面的Web.Config elmah部分中删除的,其中所有内容都将记录为“MyappName”:

<configuration>
  [...]
  <elmah>
    <security allowRemoteAccess="false" /> 
    <errorLog 
        type="Elmah.SqlErrorLog, Elmah" 
        connectionStringName="elmah" 
        applicationName="MyappName" />
  </elmah>
</configuration>

因此,问题是如何使用特定内容覆盖web.config中的applicationName设置,以便我们可以区分给定租户网站的错误。

1 个答案:

答案 0 :(得分:1)

由于这可以在web.config中配置,因此当应用程序部署到不同的位置时,ELMAH已经为您提供了指定应用程序名称的方法 - 这只是一个使用它的情况。

这通常是您在部署步骤中操作的内容。如果你是手动操作那么它会很痛苦,但是可以通过使用web.config转换来轻松操作。

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <elmah>
        <errorLog applicationName="MyappName" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
    </elmah>
</configuration>

我想知道以下内容是否可行,如果您将以下内容放入Global.asax:

var service = ServiceCenter.Current;

ServiceCenter.Current = context =>
{
    var connectionString = "YOUR CONNECTION STRING";
    var container = new ServiceContainer(service(context));
    var log = new SqlErrorLog(connectionString) { ApplicationName = "APP NAME HERE" };
    container.AddService(typeof(ErrorLog), log);
    return container;
};