Elmah logPath вне wwwroot - PullRequest
       7

Elmah logPath вне wwwroot

3 голосов
/ 29 июля 2011

Мы пытаемся развернуть наш проект, но не можем заставить elmah создать XML-логи за пределами wwwroot.В настоящее время он регистрируется в inetpub {site} \ wwwroot \ App_Data, потому что это единственный путь, который работает.Мы бы хотели, чтобы он регистрировался в нашей папке inetpub {site} \ logs.Есть идеи, как заставить это работать?Мы уже пробовали .. \ и ../ пути к папке, но, похоже, они не работают.

Ответы [ 4 ]

3 голосов
/ 12 октября 2012

ELMAH logPath может быть настроен только в Web.config и может быть виртуальным путем (если он начинается с "~ /") или абсолютным путем к файловой системе.Стандартная конфигурация ELMAH logPath в Web.config:

<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);
    }
}
2 голосов
/ 29 июля 2011

Есть идеи, как заставить это работать?

Вы можете указать абсолютный путь к файлу журнала, но вы должны убедиться, что учетная запись, настроенная для запуска вашего веб-приложения, находится подIIS имеет разрешения на запись в эту папку, чтобы он мог создавать и изменять файлы внутри.

1 голос
/ 02 августа 2011

Как отметил Дарин, вы гарантировали, что учетная запись пользователя, под которой работает веб-приложение, имеет доступ к вашей папке журналов.Я думаю, что относительный путь должен быть в порядке, хотя?Также убедитесь, что папка существует?

0 голосов
/ 02 апреля 2015

Если вам нужно установить 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;

Это позволяет вам не возвращаться к отражению.

...