Если вам нужно установить 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;
Это позволяет вам не возвращаться к отражению.