Log4net nie zapisuje dziennika w pliku dziennika


159

Utworzyłem prosty scenariusz przy użyciu Log4net, ale wygląda na to, że moje programy dołączające dzienniki nie działają, ponieważ komunikaty nie są dodawane do pliku dziennika.

Dodałem do pliku web.config:

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

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <file value="D:\MyData\Desktop\LogFile.txt" />
            <appendToFile value="true" />
            <encoding value="utf-8" />
            <layout type="log4net.Layout.SimpleLayout" />
    </appender>


    <root>
        <level value="INFO" />
        <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

W ramach globalnego pliku ASAX dodałem:

ILog logger = LogManager.GetLogger(typeof(MvcApplication));

A w ramach metody Application_Start:

logger.Info("Starting the application...");

Dlaczego dziennik testu „Uruchamianie aplikacji ...” nie jest dodawany do pliku dziennika?

Odpowiedzi:


316

Zadzwonisz

log4net.Config.XmlConfigurator.Configure();

gdzieś, aby log4net odczytał twoją konfigurację? Np. W Global.asax:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    // Initialize log4net.
    log4net.Config.XmlConfigurator.Configure();
}

4
Wielkie dzięki, to wszystko, miałem następujący wiersz: log4net.Config.BasicConfigurator.Configure (); Czy mam to wywołać, jeśli używam konfiguracji C # zamiast web.config do konfigurowania log4net? Czy to wywołanie „Configure” -Method w jakikolwiek sposób jest wymagane, ponieważ w wielu tutorialach nie znalazłem tej linii kodu.
john84

9
Istnieje wiele sposobów, aby wskazać log4net, gdzie szukać konfiguracji, zobacz logging.apache.org/log4net/release/manual/configuration.html . Wywołanie XmlConfigurator.Configure () spowoduje, że program log4net będzie szukał konfiguracji w pliku <app.exe> ​​.config lub web.config. BasicConfigurator.Configure (zgodnie z dokumentacją SDK): „Inicjuje system logowania log4net przy użyciu programu ConsoleAppender, który zapisze dane w Console.Out”.
Andreas Paulsson

FYI - możesz również użyć log4net.Config.BasicConfigurator, jeśli NIE chcesz, aby był oparty na plikach. Dane wyjściowe są wysyłane do konsoli.
silverArc

1
Konfiguruję w AssemblyInfopliku. Opublikowane jako odpowiedź poniżej.
LCJ

Argh, znalazłem tak wiele pytań i wszędzie, gdzie nie wspominają, gdzie znaleźć pliki dziennika ... Czy to takie oczywiste, że wszyscy już wiedzą?
MrFox,

50

Skorzystaj z tej strony z często zadawanymi pytaniami : Często zadawane pytania dotyczące log4net Apache

Około 3/4 drogi w dół pokazuje, jak włączyć debugowanie log4net przy użyciu śledzenia aplikacji. Dzięki temu dowiesz się, gdzie jest Twój problem.

Podstawy to:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

I widzisz ślad na standardowym wyjściu


1
Dzięki. Sprawdziłem FAQ, ale nie udało mi się rozwiązać problemu.
john84

1
Dzięki tej odpowiedzi udało mi się zidentyfikować, że moja rootsekcja odnosi się do niewłaściwego rejestratora !!
seebiscuit

świetna wskazówka. Okazało się, że użytkownik asp.net odmówił dostępu
Blue Clouds

jeśli komuś to nie zadziała, wypróbuj mój sposób, aby to wykorzystać: <log4net> <internal> <Debug value = "true"> </Debug> </internal> </log4net>
himanshupareek66

35

Jak zasugerował @AndreasPaulsson, musimy to skonfigurować. Konfiguruję w AssemblyInfopliku. Podaję configuration file nametutaj.

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

9
co się stanie, jeśli mam to i log4net.Config.XmlConfigurator.Configure (); pod obciążeniem?
n00b

1
@ n00b, to możemy skomentować tę linię, właściwie tylko w ten sposób zadziałało dla mnie "log4net.Config.XmlConfigurator.Configure ();", I jeszcze jedno: dodałem to też w ustawieniach web.config <dodaj klucz = "log4net.Internal.Debug" value = "true" />
himanshupareek66

33

Upewnij się również, że opcja „Zawsze kopiuj” jest wybrana dla pliku [log4net] .config

wprowadź opis obrazu tutaj


1
To była dla mnie poprawka. Zawsze zapominam o tym ustawieniu.
Ju66ernaut

25

Upewnij się, że proces (konto), na którym działa witryna, ma uprawnienia do zapisu w katalogu wyjściowym.

W usługach IIS 7 i nowszych jest to konfigurowane w puli aplikacji i zwykle jest to tożsamość puli aplikacji , która normalnie nie ma uprawnień do zapisu we wszystkich katalogach.

Sprawdź dzienniki zdarzeń (aplikacje i zabezpieczenia), aby zobaczyć, czy nie zostały zgłoszone żadne wyjątki.


Dziękuję za pomoc, myślałem też o problemach z uprawnieniami, ale także jeśli ustawię w folderze uprawnienia do odczytu, zapisu, modyfikacji i wykonywania wszystkim, to nie działa.
john84

@ john84 - czy otrzymujesz wyjątki? Czy spojrzałeś na dzienniki zdarzeń?
Oded

Ważne jest również, jak właśnie odkryłem, w przypadku usługi Windows działającej na określonym koncie.
Bob Mc

Wielkie dzięki, że bardzo mi pomogło.
Abbas

20

Wstawić:

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

na końcu pliku AssemblyInfo.cs


To był mój ratunek. Wykonanie projektu Desktop Forms i umieszczenie log4net.Config.XmlConfigurator.Configure (); w zasadzie nie pomagał. Dzięki
Tomas Hesse,

to mi pomogło. Miałem konfigurację w web.config, ale wydawało się, że log4net nie odbiera wprowadzonych zmian. I dodał: "Watch = true" do tego atrybutu i anithing rozpoczął pracę
Albe

3

Dla mnie przeniosłem lokalizację plików dziennika i dopiero gdy zmieniłem nazwę pliku na coś innego, zaczął się ponownie.

Wydaje się, że jeśli istnieje już plik dziennika o tej samej nazwie, nic się nie dzieje.

Następnie zmieniam nazwę starego pliku i ponownie zmieniam nazwę pliku dziennika w konfiguracji z powrotem na taką, jaka była.


2

W moim przypadku log4net nie logował się poprawnie ze względu na spację w nazwie mojego projektu. Doprowadziło mnie do szału, dlaczego ten sam kod działał dobrze w innym projekcie, a nie w nowym. Spaces. Prosta przestrzeń.

Uważaj więc na spacje w nazwach projektów. Nauczyłem się mojej lekcji.


1
Gdzie masz ten problem? Log4Net działa świetnie w jednym projekcie, ale nie w innym ... nie wiem dlaczego. Tks
Pascal

2

W moim przypadku musiałem nadać IIS_IUSRSuprawnienia do odczytu / zapisu do pliku dziennika.


1

Upewnij się, że następujący kod linii powinien znajdować się w pliku AssemblyInfo.cs.

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

a także sprawdź tę linię w metodzie Application_start ().

log4net.Config.XmlConfigurator.Configure();

0

Twój plik konfiguracyjny wydaje się poprawny. Następnie musisz zarejestrować plik konfiguracyjny Log4net w aplikacji. Możesz więc użyć poniższego kodu:

var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

Po rejestracji możesz wywołać poniższą definicję, aby wywołać rejestrator połączeń:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

log.Error("Sample log");

0

Dla mnie musiałem przenieść Loggera do pakietu Nuget. Poniższy kod należy dodać w projekcie pakietu NuGet.

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

Więcej informacji można znaleźć pod adresem https://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-issues-when-moved-it-to-a-nuget-package/ .


Staraj się unikać linków jako odpowiedzi. Nie zawsze mogą działać. Być może edytuj swoją odpowiedź, tak aby zawierała podsumowanie informacji w łączu.
Derek C.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.