我们正在尝试部署我们的项目,但我们无法让elmah在wwwroot外部创建xml日志。它目前正在登录inetpub {site} \ wwwroot \ App_Data,因为这是唯一可行的路径。我们希望将它记录到我们的inetpub {site} \ logs文件夹中。有什么想法让这个工作?我们已经尝试过.. \和../路径到文件夹,但它们似乎没有用。
答案 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;
这可以防止您不得不恢复反射。