2011-01-06 17 views
11

Chcę zaimplementować funkcję rejestrowania w bibliotece klas, do której się odwołuje w usłudze internetowej. Próbowałem dodać app.config i zrobiłem wszystko, co potrzebne, ale wydaje się, że po zgłoszeniu wyjątku log4net po prostu nic nie robi.Jak dołączyć log4net do biblioteki klas?

mój app.config

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="D:\\mylogfile.txt" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="5" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="test" /> 
     </filter> 
     <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="error" /> 
     </filter> 
     <filter type="log4net.Filter.DenyAllFilter" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %level %logger - %message%newline%exception" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO"/> 
     <appender-ref ref="RollingFileAppender"/> 
     <appender-ref ref="ConsoleAppender" /> 
    </root> 
    </log4net> 

w AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "app.config")] 

w LogManager.cs:

private static readonly ILog Log = log4net.LogManager.GetLogger 
      (MethodBase.GetCurrentMethod().DeclaringType); 
public static void WriteLog(Exception ex) 
{ 
    Log.Error(ex); 
} 

Czy możesz mi powiedzieć, co się stało? Jak mogę uruchomić log4net dla mojej biblioteki klas?

Dziękuję

+0

jak wygląda kod, w którym wywołujesz WriteLog? –

+0

btw, czy próbowałeś ustawić poziom w katalogu głównym na WSZYSTKO i spróbuj usunąć wszystkie te filtry w RollingFileAppender. –

+0

@Pauli: Próbowałem zgodnie z sugestią, nadal nie działa :) – Vimvq1987

Odpowiedz

1

proszę zobaczyć moją odpowiedź na następujące pytanie:

Use log4net in SDK

Ma procedurę konfiguracji dziennika, który zbuduje pełną ścieżkę do pliku log4net config. Ponieważ korzystasz z usługi sieciowej, nie będę szukał tego, czego oczekujesz od "app.config".

Upewnij się również, że masz uprawnienia do zapisu w "D: \ mylogfile.txt" ze swojego serwisu.

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić w nim istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/17881155) –

6

W czasie wykonywania plik konfiguracyjny jest zawsze używany z aplikacji hosta, o ile nie jest jawnie zadeklarowany. Tutaj na wypadek, że web.config jest używany nie app.cofig. Zamiast tego podaj inną niestandardową nazwę pliku konfiguracyjnego i upewnij się, że plik jest kopiowany w katalogu wirtualnym usługi WWW. Również, jak powiedział chibacity, zapewnij uprawnienia do pliku logu. Lepiej przechowywać go w folderze app_data dla hosta usługi WWW.

3

Można użyć jakiegoś zastrzyku, albo zbudować prosty jednego odczuwalna:

public interface ILogger 
{ 
    void LogInfo(string message); 
     . 
     . 
     . 
} 

A potem po prostu wstrzyknąć coś, co pasuje do tego interfejsu, jak otoczka do log4net lub takie.

Ale myślę, że najbardziej poprawną rzeczą jest niezalogowanie się do biblioteki klas. Dlaczego tak myślę, ponieważ sama biblioteka nie jest aplikacją, twoja usługa sieciowa jest taka, że ​​twoja usługa internetowa powinna decydować, co logować. Jeśli chcesz rejestrować wyjątki, po prostu nie przechwytuj ich w bibliotece klas i nie pozwól, aby twoja usługa obsługiwała rejestrowanie. Ułatwi to również scentralizowanie rejestrowania.

+0

@Thomas Zgadzam się ponownie. używając abstrakcji, ale istnieje wiele dobrych powodów, dla których możesz chcieć, aby biblioteka się zalogowała, np.diagnostyka i audyt. Jeśli coś jest nie tak z biblioteką, posiadanie diagnostyki, która może być włączona, jest dobrą rzeczą. –

+0

@chibacity: Nazywam się Tomas, a nie Thomas;). Poza tym zgadzam się z wami w tym względzie, ale uważam, że należy go ograniczyć do minimum. Jeśli coś jest nie tak w bibliotece, wyjątek powinien powiedzieć, a to może być zarejestrowane wyżej w stosie. W idealnym świecie biblioteka powinna być stroną trzecią (ale ty też możesz być trzecią częścią), która powinna być "zrobiona". A może mówisz o innych rodzajach "błędów"? Błędy, które nie powodują wyjątków? –

+0

Przepraszamy za pisownię nazw :) Mam na myśli informacje, które mogą pomóc w analizie problemów, które mogą nie prowadzić do wyjątków. Nawet w przypadkach, w których występują wyjątki, często przydatne jest posiadanie informacji diagnostycznych z otoczenia, aby zobaczyć warunki, które prowadzą do błędu. Może to mieć szczególne znaczenie w produkcji, w której oprogramowanie może być wykorzystywane w okrutny i niecodzienny sposób;) –

Powiązane problemy