Мы пытаемся развернуть наш проект, но не можем заставить elmah создавать журналы xml за пределами wwwroot. В настоящее время он регистрируется в inetpub{site}\wwwroot\App_Data, потому что это единственный путь, который, похоже, работает. Мы хотели бы, чтобы он регистрировался в нашей папке inetpub{site}\logs. Любые идеи о том, как заставить это работать? Мы уже пробовали пути ..\ и ../ к папке, но они, похоже, не сработали.
Elmah logPath за пределами wwwroot
Ответы (4)
Любые идеи о том, как заставить это работать?
Вы можете указать абсолютный путь к файлу журнала, но вы должны убедиться, что учетная запись, настроенная для запуска вашего веб-приложения в IIS, имеет права на запись в эту папку, чтобы она могла создавать и изменять файлы внутри.
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);
}
}
Как упомянул Дарин, вы убедились, что учетная запись пользователя, под которой работает веб-приложение, имеет доступ к вашей папке журналов. Я думаю, что относительный путь должен быть в порядке? Также убедитесь, что папка существует?
Если вам нужно установить 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;
Это позволяет вам не возвращаться к отражению.