2011-07-29 1 views
3

우리는 프로젝트를 배포하려하지만 elmah가 xml 로그를 wwwroot 외부에 생성하도록 할 수 없습니다. 현재 inetpub {site} \ wwwroot \ App_Data에 로깅 중입니다. 작동하는 것으로 보이는 유일한 경로이기 때문입니다. 우리는 inetpub {site} \ logs 폴더에 로그를 남기고 싶습니다. 이 아이디어를 얻으려는 아이디어가 있습니까? 우리는 이미 .. \ 및 ../ 경로를 시도했지만 작동하지 않는 것 같습니다.Elmah logPath outside wwwroot

답변

2

이 아이디어를 얻으려는 아이디어가 있으십니까?

로그 파일의 절대 경로를 제공 할 수 있지만 IIS에서 웹 응용 프로그램을 실행하도록 구성된 계정에 파일을 만들고 수정할 수 있도록이 폴더에 대한 쓰기 권한이 있는지 확인해야합니다.

1

Darin이 언급했듯이 웹 응용 프로그램이 실행되는 사용자 계정이 로그 폴더에 액세스 할 수 있는지 확인 했습니까? 상대 경로가 잘되어야한다고 생각합니까? 또한 폴더가 있는지 확인하십시오.

3

ELMAH logPath는 Web.config에서만 구성 할 수 있으며 가상 경로 ("~ /"로 시작하는 경우) 또는 절대 파일 시스템 경로 일 수 있습니다.

<elmah> 
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/Elmah.Errors" /> 

그러나 프로그램 ELMAH logPath에 설정하는 방법 해결 방법이 있습니다 :의 Web.config에 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); 
    } 
} 
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; 

는 반사로 복귀 할 필요가 없습니다.

+0

좋은 생각이지만 샘플 코드에는 문제가 있습니다. 'Requires'는 여기에서 null 확인을 수행하기위한 사용자 정의 클래스입니다. 또한 Dictionary 개체에는 구문 문제가 있습니다. – user3885927