2012-05-21 18 views
6

Jestem całkiem nowy w usługach Windows. Stworzyłem instalator dla mojej usługi C# Windows i wygląda na to, że instalacja na serwerze (Windows Server 2003) zadziałała. Po uruchomieniu zapisuje Service started successfully w dzienniku. Po zatrzymaniu pisze Service stopped successfully. Jednak czasami usługa przestaje działać bez zapisywania czegokolwiek w dzienniku, więc uruchamiam ją ręcznie. Kiedy patrzę na dziennik po nim, to zgodnie z oczekiwaniami mówi Service started successfully. To dziwne, widząc, że w dzienniku dwa razy z rzędu jest oczywiste, że brakuje wpisu, w którym usługa przestała działać.Dlaczego moja usługa C# Windows przestaje działać bez zapisywania jakichkolwiek komunikatów w dzienniku zdarzeń aplikacji?

Jakie mogą być tego potencjalne przyczyny? Mam usługę skonfigurowaną jako automatyczną i zainstalowałem ją tak, aby działała dla wszystkich użytkowników. Miałem wrażenie, że oznacza to, że usługa uruchamia się automatycznie po każdym uruchomieniu komputera. Jak mogę się dowiedzieć, dlaczego to się zatrzymało? Czy usługi, które powodują awarię, automatycznie zapisują w dzienniku zdarzeń, czy też muszę obsługiwać wyjątki w taki sposób, aby rejestrować własny powód awarii?

Edit: Niektóre dodatkowe info:

  • mam go skonfigurować, aby zalogować się jako lokalne konto systemowe
  • Pod opcji odzyskiwania, mam go skonfigurować, aby ponownie na pierwszym niepowodzeniu. Nie mam nic do drugiej lub następnej awarii.

Aktualizacja: Program odpowiadający zalecił obsługę wyjątku globalnego. Chociaż nie będę go wprowadzał jako stałej poprawki, przynajmniej pomoże mi to ustalić, gdzie występuje problem. Właściwie to przetestowałem z moją zainstalowaną usługą i to działa. Dowiedziałem się, że nieobsługiwane wyjątki faktycznie powodują awarię usługi bez zapisywania czegokolwiek w dzienniku. Pomyślałem, że przynajmniej zgłosi jakiś błąd aplikacji, ale tak nie jest.

static void Main() 
{ 
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

    //other code here 
} 

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    Utilities.WriteIt(e.ExceptionObject as Exception); 
} 
+0

Czy sprawdziłeś dziennik zdarzeń? – pms1969

Odpowiedz

4

Zawsze najlepiej postępować z wyjątkami. Przynajmniej użyciu globalnej obsługi wyjątku i zapisać go do pliku dziennika

+0

Poszedłem na tę trasę i wygląda na to, że działa (zaktualizowałem moje pytanie z kodem). BTW, obsługuję wyjątki, ale nie mam wszędzie bloków try/catch. Implementacja globalnego programu obsługi działa świetnie i pozwoli mi dowiedzieć się, gdzie występują problemy. Dzięki! – oscilatingcretin

3

Brzmi jak usługa jest nieoczekiwanie braku, nie robiąc żadnej formy obsługi wyjątków i/lub logowania. Usługi systemu Windows nie zapisują automatycznie wyjątków do dziennika zdarzeń - od Ciebie zależy, czy będziesz obsługiwał wyjątki, i (jeśli są one fatalne), wypisz je gdzieś, aby móc zdiagnozować problem.

Przynajmniej polecam gdzieś plik dziennika (być może w folderze wykonywalnym usługi, lub najlepiej w innym miejscu, do którego łatwo można się dostać i nie będzie działał problem z uprawnieniami) i standardową metodą rejestrowania, która Twoi wychowawcy wyjątków wzywają do napisania swoich wiadomości.

0

Jeśli usługa nieoczekiwanie kończy pracę z powodu jakiegoś wyjątku, nie jestem pewien, że w końcu w dzienniku zdarzeń automatycznie.

Gorąco polecam pakiet rejestrowania jak log4net dla bardziej dokładnego rejestrowania. Będziesz w stanie zapewnić wiele poziomów rejestrowania (śledzenie śladów, aby zobaczyć, czy osiągnąłeś pewien kod, ślady informacji o ważnych zdarzeniach, ślady błędów przy rejestrowaniu wyjątków).

Możesz obejrzeć here jako przykład EventLogAppender. Sugerowałbym jednak rozpoczęcie od uzyskania FileAppendera, jednego z najłatwiejszych logów do utworzenia, najpierw pracy, a następnie dodania drugiego aplikatora do dziennika zdarzeń.

Powiązane problemy