Elmah logPath за пределами wwwroot

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


person OhBugger    schedule 29.07.2011    source источник


Ответы (4)


Любые идеи о том, как заставить это работать?

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

person Darin Dimitrov    schedule 29.07.2011

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);
    }
}
person Vlad Rudenko    schedule 12.10.2012

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

person jamiebarrow    schedule 02.08.2011

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

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

person Steven    schedule 02.04.2015
comment
Хорошая идея, но есть проблемы с вашим примером кода. Кажется, «Требуется» — это ваш пользовательский класс для проверки нуля здесь. Также объект Dictionary имеет проблемы с синтаксисом. - person user3885927; 25.02.2016