2010-02-24 1 views
4

가능한 한 OnStart() 및 OnStop() 메서드에서 기록하는 진단 버전의 서비스가 있습니다.시스템 종료로 인해 Windows 서비스가 종료되고 있음을 어떻게 기록 할 수 있습니까?

캡처 할 수없는 이벤트 중 하나는 컴퓨터가 실제로 다시 시작될 때입니다. 내 로깅 기능은 대개 데이터베이스의 테이블에 출력을 기록하지만 사용할 수없는 경우 EventLog에 게시됩니다.

재부팅 할 때 내 서비스는 테이블이나 EventLog에 기록하지 않습니다.

SQL Server가 종료되는 과정에서 테이블에 게시 할 수 없지만 타이밍 문제로 인해 EventLog가 종료되기 전에 이벤트 로그가 종료 될 수도 있습니다. 서비스는 디폴트로 거기에 쓸 수 있습니다. 종료의 경우

는 MSSQLSERVER는 이벤트 로그에 정보 메시지를보고

SQL 서버로 인해 시스템 종료로 종료된다. 이는 정보 메시지입니다. 사용자 작업은 필요하지 않습니다.

내 서비스와 비슷한 것을 할 수있는 방법이 있습니까?

답변

3

Windows 서비스의 종속성을 지정하여 다른 서비스가 필요할 수 있습니다. EventLog 서비스에 대한 종속성을 지정하면 Windows는 이벤트 로그를 종료하기 전에 서비스가 종료 될 때까지 대기합니다.

http://kb2.adobe.com/cps/400/kb400960.html은 몇 가지 레지스트리 키를 수정하여이를 수행하는 방법을 설명합니다.

이동 서비스 \ CURRENTCONTROLSET \ HKEY_LOCAL_MACHINE을 \ 시스템에 당신은에 대한 종속성을 설정 을 필요로하는 서비스를 찾습니다. 우측 쪽의 'DependOnService'키를 엽니 다. 선택한 서비스에 의 'DependOnService'키가 없다면 을 마우스 오른쪽 버튼으로 클릭하고 새로 만들기> 다중 문자열 값을 선택하여 만듭니다. 값 필드에 현재 서비스 이 의존하는 모든 서비스의 이름을 과 같이 입력하십시오. 각 서비스 이름은 을 올바르게 입력해야하며 별도의 행에 입력해야합니다.

+0

데이비드 - 그게 내가 사용한 해결책 이었어. 처음에는 의존성을 프로그램 적으로 설정하기를 희망했지만 가능한 권한 문제로 신뢰할 수있는 방법으로 설치 프로그램 코드를 사용하는 것이 유일한 방법이라고 생각합니다. 나는 실행할 수있는 .reg 파일을 만들어서 배포의 복잡성을 줄였습니다. 감사합니다! – davecoulter

3

서비스에서 재정의 할 수있는 OnShutdown 방법이 있습니다. 기계가 꺼질 때 호출됩니다. 해당 메서드에서 이벤트 로그에 기록한 다음 base.OnShutdown()을 호출하십시오.

+0

프로 데를 SessionEnded : 나는 당신이 찾고있는 이벤트라고 생각합니다 OnStop()은 시스템 종료시 발생하지 않는 것 같습니다. 고마워! – davecoulter

0

ONSTART에 캡처 SystemEvents.SessionEnding

당신은 그것을 캡처

같은

Microsoft.Win32.SystemEvents.SessionEnding += new Microsoft.Win32.SessionEndingEventHandler(this.zomgRebootinglol); 
+0

그의 문제는 셧다운 이벤트를 캡처하지 않습니다. 즉, 서비스가 로그를 기록 할 때까지 이미 로그 프로그램이 종료되었다는 것입니다. –

0

당신은 SystemEvents-Class를 사용하여 윈도우 이벤트를 캡처 할 수 있습니다 처리 할 수 ​​있습니다.

events도 참조하십시오.() 내 최종 솔루션에 나는 또한 OnShutdown 무시할 도움이 것을 발견했다 - SystemEvents :: PowerModeChanged 이벤트 및/또는 SystemEvents이 ::

+0

그의 문제는 종료 이벤트를 캡처하지 않습니다. 즉, 서비스가 로깅하려고 시도 할 때까지 이미 로거가 사라 졌다는 것입니다. –