2010-08-02 2 views
3

우리 웹 서버에 파일을 업로드하는 매우 간단한 ASP.Net 페이지가 있습니다. 이 페이지에는 컨트롤이 없습니다. 클라이언트는이를 사용하여 매일 밤 파일을 자동으로 보내줍니다.ASP.Net 파일 업로드를위한 페이지가 로그 문 중간에서 처리를 중지합니다

경우에 따라 파일이 수신되지 않는 것 같지만 고객이 보낸 것으로 신고합니다.

일부 로깅 문을 페이지에 추가하여 아주 이상한 것을 발견했습니다. 페이지는 로그 문 중간에서 바로 실행을 중단합니다. 예외는 없습니다. 여기

코드 숨김이다

protected void Page_Load(object sender, EventArgs e) { 
    try { 
     // record that request came in at all 
     log.Debug("Update Inventory page requested through HTTP {2} on {0} {1}", DateTime.Now.ToShortDateString(), DateTime.Now.ToLongTimeString(), IsPostBack ? "POST" : "GET"); 

     // make sure directory exists 
     string basePath = Server.MapPath("~/admin/uploads/"); 
     log.Debug("Saving to folder {0}", basePath); 

     if (!Directory.Exists(basePath)) { 
      log.Debug("Creating folder {0}", basePath); 
      Directory.CreateDirectory(basePath); 
     } 

    // generate a unique file name 
     string fileName = DateTime.Now.Ticks.ToString() + ".dat"; 
     string path = basePath + fileName; 
     log.Debug("Filename to save is {0}", fileName); 

    // record initial bytes of stream/file 
    StreamReader reader = new StreamReader(stream); 
    string fileContents = reader.ReadToEnd(); 

    log.Debug("File received by GET is " + fileContents.Length + " characters long and begins with: " 
     + Environment.NewLine + fileContents.Substring(0, Math.Min(fileContents.Length, 1000))); 

    // write out file 
    File.WriteAllText(path, fileContents); 

     log.Debug("Update Inventory page processing finished."); 
     // trap for and record any and all exceptions 
    } 
    catch (Exception ex) { 
     log.Debug(ex); 
    } 
} 

처리가 된 FileContents 변수의 길이 및 제 1 부분을 출력하는 로그 문장의 중간 다이 보인다. 프로세스가 실패 할 때 발생하는 로그는 다음과 같습니다

2010-08-02 02:46:01.7342|DEBUG|UpdateInventory|Update Inventory page requested through HTTP GET on 8/2/2010 2:46:01 AM 
2010-08-02 02:46:01.7655|DEBUG|UpdateInventory|Saving to folder c:\hosting\sites\musicgoround.com\wwwroot\admin\uploads\ 
2010-08-02 02:46:01.7811|DEBUG|UpdateInventory|Filename to save is 634163139617811250.dat 
2010-08-02 02:48:02.3905|DEBUG|UpdateInventory| 

정말 이런하게 이해하지 않습니다.

파일 전송에 오류가 발생하여 reader.ReadToEnd() 행에서 예외가 발생한다고 가정합니다. 예외는 아니지만 페이지 처리가 계속되기를 기대하지만 파일의 일부만 수신 할 수 있습니다 (어떤 경우에는 로그해야합니다).

로깅 문은 문자열 변수에만 액세스하며 try-catch 내부에 있습니다. NLog는 우리가 사용하는 로깅 구성 요소이며 Codeplex의 Simple Logging Facade 프로젝트에서 제공하는 외관을 통해 액세스합니다. 따라서 우리는 로깅 구성 요소가 다소 방탄하지 못하도록 믿습니다. 문제를 야기시키는 여기에 사용되는 것은 보이지 않습니다.

그래서 거래가 무엇입니까? 왜 지구상에서이 페이지를 막 시작하고 이렇게 처리하지 않을 수 있습니까?

반 완료 로깅 구문을 얻는 것은 로깅 시스템에서 삼킨 오류를 가리키는 것처럼 보이지만 실제로는 그렇게 할 것 같지 않습니다. 우리는 NLog의 내부 로깅을 가지고 있으며 문제를보고하지 않습니다.

답변

0

가능성이 가장 높은 후보는이 라인이 :

2010-08-02 02:48:02.3905|DEBUG|UpdateInventory| 

이 발생합니다 :

log.Debug(ex); 

즉, 그것은 예외를 던지고 있지만 로거는 유용한 것을 기록하지 않습니다. 로그 수준을 약간 변경해보십시오. 에러 예외 로깅 수준을 변경

log.Error(ex); 

실제로 예외를 던지고하고 제대로 예외 문자열을 기록뿐만 아니라 로거 있는지 확인할 수 있습니다 방법.

+0

오 ... 내 대답은 NLog 구성 파일을 다시 확인하라는 메시지를 표시하고 서버 버전은 Google의 개발자 버전과 일치하지 않습니다. 구체적으로 레이아웃은 없으며 기본적으로 NLog에는 예외 세부 정보가 포함되어 있지 않습니다. 로그 레이아웃에서. 무슨 감시 야 ... –

+0

테, 그는 대부분의 사람들이 어떤 시점에서 비슷한 문제가있었습니다. 적어도 문제는 이제 이해가된다 ;-) –

관련 문제