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?

john84
źródło

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();
}
Andreas Paulsson
źródło
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

bechbd
źródło
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)]
LCJ
źródło
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

kokabi
źródło
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.

Oded
źródło
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

shay
źródło
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.

kernowcode
źródło
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.

zanussi
źródło
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.

Rahatur
źródło
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();
Prajakta Kale
źródło
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");
Mahmut EFE
źródło
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/ .

Gurunadh Duvvuru
źródło
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.