2011-07-04 2 views
1

나는 로그를 저장하는리소스를 해제하는 프로그램 종료를 잡는 방법? 내 프로그램에서

logWriter = File.CreateText(logFileName); 

을 사용하고 있습니다.

logWriter.Close()를 호출해야 할 곳은 어디입니까? 그것은 finalizer일까요? 당신은 당신이 가장 가능성이 using 문을 원하지 않을 것이기 때문에 앱 기간 동안 살고 logWriter를 원하는 경우

+2

파일 핸들을 닫아야합니다. 쓰기가 끝나자 마자 나 프로그램 종료가 이상적입니까? 이 오류를 잠재적으로 기록하려면 오류/예외가 발생할 경우 오류가 올바르게 닫혀 있는지 확인해야합니다. –

답변

1

네, 완료하면 파일을 닫아야합니다. 로그 클래스를 만들거나 (예 : log4net과 같은 기존 클래스를 사용하여) IDisposable을 구현하고 리소스를 해제하는 Dispose -method 메서드를 구현할 수 있습니다.

using-block으로 감쌀 수 있지만 별도의 수업을 듣고 싶습니다. 이렇게하면 나중에 응용 프로그램이 여러 스레드에서 실행되고 동시에 파일에 쓰려고 할 때 어떤 일이 발생하는지 등의 고급 로깅을 처리 할 수 ​​있습니다.

log4net은 text-file or a database을 사용하도록 구성 할 수 있으며 응용 프로그램이 커지면 쉽게 변경할 수 있습니다.

3

일반적인 접근 방식은

using (var logWriter = File.CreateText(logFileName)) 
{ 
    //do stuff with logWriter 
} 

그러나, using 성명에서 File.CreateText을 래핑하는 것입니다,이 불편하다 앱의 Main 메소드를 둘러 쌉니다.

이 경우 앱이 종료되기 전에 을 logWriter에 전화해야합니다. 정확하게 말하면 using이 당신을 대신합니다.

0

열려있는 로그 파일이있는 경우 OS는 응용 프로그램이 종료 될 때 프로세스를 종료 할 때 파일을 해제합니다. 실제로 이것을 명시 적으로 관리 할 필요는 없습니다.

OS가 파일 핸들을 정리하게하는 한 가지 문제는 파일 작성자가 버퍼링을 사용하고 버퍼의 나머지 부분을 쓰기 전에 플러시를해야한다는 것입니다. close \ dispose를 호출하지 않으면 정보가 손실 될 수 있습니다. 플러시를 강제 한 가지 방법은 예를 들어, 닷넷 프로세스가 종료 될 때 호출되는 것이다 AppDomain unload 이벤트 후크하는 것입니다

AppDomain.CurrentDomain.DomainUnload += delegate { logWriter.Dispose(); }; 

도메인 언로드 이벤트 핸들러에서 발생할 수있는 일에 시간 제한이 있습니다, 하지만 파일 작성자 버퍼의 유물을 쓰는 것은 이것으로 충분합니다. 기본 설정이 있다고 가정합니다. 즉, 기본값은 AppDomain입니다. 그렇지 않으면 로깅을 포함하여 모든 과정이 까다로워집니다.

파일을 열어 두는 경우 다른 프로세스가 읽기 액세스 권한을 가질 수있는 액세스 권한으로 파일을 여는 것이 좋습니다. 이렇게하면 프로그램이 실행되는 동안 파일 테일러 나 텍스트 편집기와 같은 프로그램을 사용하여 파일을 읽을 수 있습니다.

관련 문제