在wwwroot之外的Elmah logPath

时间:2011-07-29 13:10:12

标签: asp.net-mvc-3 elmah

我们正在尝试部署我们的项目,但我们无法让elmah在wwwroot外部创建xml日志。它目前正在登录inetpub {site} \ wwwroot \ App_Data,因为这是唯一可行的路径。我们希望将它记录到我们的inetpub {site} \ logs文件夹中。有什么想法让这个工作?我们已经尝试过.. \和../路径到文件夹,但它们似乎没有用。

4 个答案:

答案 0 :(得分:3)

ELMAH logPath只能在Web.config中配置,可以是虚拟路径(如果以“〜/”开头)或绝对文件系统路径。 Web.config中ELMAH logPath的默认配置是:

<elmah>
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/Elmah.Errors" />

但是有一种解决方法如何以编程方式设置ELMAH logPath:

public class MvcApplication : HttpApplication
{
    private static string _elmahDirectory;
    private static readonly FieldInfo ElmahLogPathField = typeof(XmlFileErrorLog).GetField("_logPath", BindingFlags.NonPublic | BindingFlags.Instance);

    protected void Application_Start()
    {
        // Assign your path here
        _elmahDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        ...
    }

    protected void Application_BeginRequest()
    {
        var xmlFileErrorLog = (XmlFileErrorLog)Elmah.ErrorLog.GetDefault(HttpContext.Current);
        ElmahLogPathField.SetValue(xmlFileErrorLog, _elmahDirectory);
    }
}

答案 1 :(得分:2)

  

关于让它发挥作用的任何想法?

您可以提供日志文件的绝对路径,但是您应该确保配置为在IIS下运行Web应用程序的帐户具有对此文件夹的写入权限,以便它可以在其中创建和修改文件。

答案 2 :(得分:1)

正如Darin所说,您是否确保运行Web应用程序的用户帐户可以访问您的日志文件夹。我认为相对路径应该没问题呢?还要确保该文件夹存在吗?

答案 3 :(得分:0)

如果您需要从代码中设置logPath而不是在配置文件中配置它,那么这是如何做到的:

默认情况下,ELMAH会读取您的web.config文件,以找出要创建的ErrorLog实现。但是,您可以覆盖此机制来实现您自己的IServiceProvider实现并注册使用ServiceCenter.Current属性返回实例的委托。

这样的IServiceProvider实现如下所示:

internal sealed class ElmahServiceProvider : IServiceProvider
{
    private readonly ErrorLog defaultErrorLog;

    private ElmahServiceProvider(ErrorLog defaultErrorLog)
    {
        Requires.IsNotNull(defaultErrorLog, "defaultErrorLog");
        this.defaultErrorLog = defaultErrorLog;
    }

    public object GetService(Type serviceType)
    {
        return serviceType == typeof(ErrorLog) ? this.defaultErrorLog : null;
    }
}

在应用程序启动期间,您可以执行以下操作:

// Option 1: using a virtual path
var logger = new XmlFileErrorLog(new Dictionary<string, string>
{
    { "logPath", "~/myCustomPath" }
});

// Option 2: using a fixed path
var logger = new XmlFileErrorLog("c:\\logFiles");

// Creating the provider and registering it in the ServiceCenter.
var provider = new ElmahServiceProvider(logger);
ServiceCenter.Current = c => provider;

这可以防止您不得不恢复反射。