2010-06-29 21 views
7

Mam aplikację konsoli, którą konwertuję do usługi Windows. Jako aplikacja konsolowa logowanie log4net działa poprawnie. Ale przekształcając go w usługę Windows, moje logowanie log4net przestało działać.log4net nie działa w usłudze Windows

Dodałem to do moich assemblyInfo.cs w projekcie usług:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 

To jest moje klasy usługi z onStart i OnStop:

private static log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
     private Builder _builder; 

     public YCSWebServerService() 
     { 
      InitializeComponent(); 
      _builder = new Builder(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      _log.Info("YCSWebServerService started"); 
      _builder.Start(); 
     } 

     protected override void OnStop() 
     { 
      _log.Info("YCSWebServerService stopped"); 
      _builder.Stop(); 
     } 

mam "specyficzny" log4net config plik dodany do mojego projektu usługowego:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 

    <log4net> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="EventLogAppender" /> 
    </root> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
     <threshold value="DEBUG" /> 
     <applicationName value="Lantic YCS WebServer" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="(%-5level %date{hh}:%date{mm}:%date{ss} [%thread] %logger [%property{NDC}]) %message %n" /> 
     </layout> 
    </appender> 
    </log4net> 

</configuration> 

Wszelkie pomysły i porady?

+0

Rozwiązałem ten problem przez nadpisanie aplikacji: Sprawdź ten numer: http://stackoverflow.com/questions/1922430/how-do-you-make-log4net-output-to-current-working-directory/1922805#1922805 – RClemens

Odpowiedz

1

Niektóre rzeczy, które należy wypróbować:

Czy użytkownik korzystający z usługi ma uprawnienia do zapisu?

Czy są rejestrowane wszystkie wyjątki w dziennikach systemu Windows?

Czy próbowałeś uruchomić usługę w trybie debugowania, aby sprawdzić, czy Log4net jest rzucając jakiekolwiek wyjątki?

+0

EventLogAppender nie będzie wyrzucaj wyjątki, ponieważ log4net ma własną procedurę obsługi błędów Domyślnie ta procedura obsługi błędów zapisuje wyjątek do Console.Error.WriteLine i Trace.WriteLine przy pierwszym wystąpieniu.Każde kolejne wystąpienie jest ignorowane. Możesz użyć własnego programu obsługi błędów, np. u dołu tego artykułu: http://blogs.myfirstsharepoint.de/archive/2009/06/02/aus-der-praxis-%E2%80%93-securityexception-beim-loggen-mit-eventlogappender-von-log4net. tak jak px (artykuł jest w języku niemieckim, ale to nie szkodzi kodowi, prawda?) – Hinek

1

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=293617

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/5bef59bc-a28f-4e6d-8ddb-730e12764162

W systemie Windows Vista, Windows XP SP 2, Windows Server 2003, 2008 i Windows 7 użytkownik musi uprawnienia administratora aby uzyskać dostęp do dziennika zabezpieczeń. Teraz, gdy log4net próbuje utworzyć dziennik zdarzeń Źródło, wszystkie dzienniki są sprawdzane, jeśli już istnieje. Tak więc w przypadku usługi Windows użytkownik serwera Windows będzie potrzebować uprawnień administratora (co nie jest dobre).

Rozwiązanie: skonfiguruj jawne źródło w konfiguracji log4net (tak jak zrobiłeś: <applicationName value="Lantic YCS WebServer" />, Lantic YCS WebServer jest Twoim źródłem) i utwórz to Źródło w twoim Instalatorze (ponieważ Instalator-Użytkownik powinien mieć uprawnienia Administratora).

+0

Moje konto użytkownika ma prawa administratora i nie ma żadnych wyników. Nie byłem w stanie dowiedzieć się, co masz na myśli, definiując jednoznaczne źródło w mojej konfiguracji? czy możesz opublikować link lub przykład? – lmkk

+0

I nic nie dostałem z linków, które opublikowałeś – lmkk

+0

Niestety, czasami piszę trochę skomplikowane. Masz już skonfigurowane jawne Źródło: ... Zmieniłem moje pytanie ... – Hinek

6

Czy dodałeś sekcję log4net do pliku app.config? W swoim pytaniu wspomniałeś, że masz "konkretny plik konfiguracyjny log4net", ale podany przykład wygląda jak cała zawartość app.config. Jeśli app.config jest, to można mieć prostszą ciąg w AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

dodając także requirePermission = „false” do sekcji w moim app.config pomógł mi, gdy ustalone podobny problem z log4net nie zalogowaniu do pliku dla Windows Service (patrz dodatkowy atrybut - requirePermission = „false”):

<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/> 
    </configSections> 
+0

Pracowałem dla mnie. Zawsze zapominam o części montażowej. –

0

No to pytano dawno z powrotem, mam sugestię, które mogą być pomocne dla każdego, kto szuka rozwiązanie tego problemu. Jeśli konwertujesz aplikację konsoli na usługę Windows ... musisz utworzyć instalator do zainstalowania aplikacji. Podczas instalacji aplikacji tworzy ona folder instalacyjny dla usługi zwykle w ramachProgramFile ..... (Sprawdź, kiedy instalujesz swoją usługę .. daje ścieżkę do katalogu instalacyjnego). Jeśli w pliku web.config podałeś ścieżkę do pliku dziennika jako "Log \ Log.txt ", wtedy w folderze instalacji pojawi się folder (Log) z Twoim plikiem dziennika (Log.txt) marnujesz swój czas, jeśli szukasz pliku logu w folderze aplikacji

Powiązane problemy