2009-10-22 14 views
13

Mam usługę Windows, w której plik app.config i pliki log4net.config są oddzielne. Rejestrowanie nie działa.Jak skonfigurować log4net dla usługi C# Windows

W moim pliku app.config, mam następujący w sekcji:

<add key="log4net.Config" value="log4net.config"/> 

to działa, jeśli wartości określić bezwzględną ścieżkę do pliku log4net.config.

Czy muszę podać bezwzględną ścieżkę do log4net.cong? Zarówno plik log4net.config, jak i app.config znajdują się w tym samym folderze co plik wykonywalny.

jakieś pomysły?

Parag

Odpowiedz

21

Może to jest pomocny (Moving your Log4Net configuration out of web.config with ASP.NET 2.0 web sites.).

Oto elementy, które mogą Cię zainteresować:

Powiedz aplikację do konfiguracji log4net stosując ten plik konfiguracyjny. Tam są naprawdę dwa miejsca na to. Najpierw, plik global.asax, a po drugiej plik assemblyInfo.cs. Zauważ, że większość czasu zaczyna się od pliku globalnego.asax z całym kodem w linii. Z jakiegoś powodu jedyny sposób, w jaki mogłem to zrobić, to złamać plik global.asax, aby użyć kodu , a następnie przypisać plik assembly.fo. . Tak kończy się wygląda tak.

global.asax: <% @ Application Language = "C#" dziedziczy = "GlobalAsax" %> Global.asax.cs (w folderze App_Code):

using System; 
using System.Web; 

public class GlobalAsax : HttpApplication 
{ 
    // you may have lots of other code here 
    void Application_Start(object sender, EventArgs e) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 
    } 
} 

teraz że twoja aplikacja dzwoni w konfigurację log4net, możesz ustawić atrybut w swoim zespole info, aby log4net wiedział, gdzie szukać pliku konfiguracyjnego, . AssemblyInfo.cs (w folderze App_Code ):

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

Flaga zegarek opowiada log4net, aby mieć oko na pliku konfiguracyjnego dla potencjalnych zmian. Jest to przydatne, jeśli chcesz zmienić konfigurację z rejestrowania everthing na błędy tylko na podczas próby.

Aby upewnić się, że log4net.config jest zawsze tam, dodać log4net.config do csproject, i ustawić ją na CopyAlways. Powinien zostać wyświetlony w folderze debugowania.

Możesz użyć skryptu, aby skopiować wszystko do folderu wydania, lub jeśli używasz projektu instalacji MS, ręcznie dodaj ten plik do projektu. Następnie zostanie dodane odniesienie.

+1

ja właśnie udało się zrobić to z informacjami z http://mitch-wheat.blogspot.com/2007/04/ log4net-net-logging-tool.html, ale teraz mam problem, że instalator nie skopiuje pliku log4net.config podczas instalacji usługi. Jak mogę uzyskać plik log4net.config w moim projekcie instalacji? –

+3

Mój przyjacielu, dałbym ci 1000 punktów, gdybym mógł. Jest piątkowa noc, chcę iść do domu, a moja głupia usługa loguje się, jeśli uruchomiona jako aplikacja konsolowa, ale nie po uruchomieniu z panelu Usługi. I to był brakujący atrybut [assembly]. Dzięki. –

+2

Kiedyś używałem tylko atrybutu assembly dla aplikacji konsolowych, ale wygląda na to, że usługi Windows potrzebują obu atrybutów linii i zespołu 'log4net.Config.XmlConfigurator.Configure();'. – keremispirli

13

Dla usługi Windows bieżącym katalogiem jest Windows \ system32 - a XmlConfigurator.Configure() używa FileInfo, które traktuje względne ścieżki względem bieżącego katalogu. Log4net szuka pliku konfiguracyjnego w systemie Windows \ system32.

XmlConfiguratorAttribute z drugiej strony wykorzystuje BaseDirectory aplikacji, dlatego zawsze działa.

Alternatywnie, można wykonać następujące przed wywołaniem XmlConfigurator.Configure():

System.IO.Directory.SetCurrentDirectory (AppDomain.CurrentDomain.BaseDirectory); 
+0

To był bardzo przydatny komentarz dla mnie! Dzięki. –

+0

Ten sam numer tutaj i ta bryłka informacji o ścieżkach bazowych była kluczowa. Dzięki. – xan

Powiązane problemy