Używamy log4net i chcemy określić jego konfigurację w zewnętrznym pliku konfiguracyjnym (tak jak to zrobiliśmy z innymi sekcjami). Aby to zrobić, zmieniliśmy sekcję log4net w pliku App.config na:
...
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...
A w pliku Log.Config (w tym samym katalogu co App.config) mamy:
<log4net>
<appender name="General" type="log4net.Appender.FileAppender">
<file value="myapp.log" />
<layout type="log4net.Layout.SimpleLayout" />
</appender>
<root>
<appender-ref ref="General" />
</root>
</log4net>
Jednak po uruchomieniu aplikacji nie jest tworzony plik dziennika (ani rejestrowanie nie jest wykonywane). Na konsoli nie są wyświetlane żadne komunikaty o błędach.
Jeśli przeniesiemy zawartość pliku Log.config z powrotem do pliku App.config (zastępując pierwszą linię kodu powyżej), będzie działać zgodnie z oczekiwaniami. Masz jakiś pomysł, dlaczego nie działa w zewnętrznym pliku?
Odpowiedzi:
Czy masz następujący atrybut w swoim
AssemblyInfo.cs
pliku:i taki kod na początku każdej klasy, który wymaga funkcji logowania:
Mam post na blogu zawierający te i inne informacje tutaj .
źródło
W tej kwestii istnieje otwarta usterka . Log4Net nie obsługuje atrybutu configSource elementów konfiguracji. Aby użyć rozwiązania opartego wyłącznie na plikach konfiguracyjnych, należy użyć klucza log4net.Config w pliku appSettings.
Krok 1: Uwzględnij definicję sekcji normalnej konfiguracji:
Krok 2: Użyj magicznego klucza log4net.Config w appSettings.
Krok 3: Prześlij poprawkę, aby naprawić obsługę configSource.
źródło
Krok, który został pominięty, to
spowoduje to użycie configSource. Upewnij się, że wywołałeś to raz przed wywołaniem GetLogger ();
źródło
Upewnij się, że plik log4net.config ma ustawione następujące właściwości:
Tworzenie akcji: zawartość
Kopiuj do katalogu wyjściowego: Kopiuj zawsze
źródło
Albo użyj,
Lub tylko,
W obu przypadkach plik Log4Net.config powinien znajdować się w katalogu wyjściowym. Możesz to zrobić, ustawiając właściwości pliku Log4Net.config w eksploratorze rozwiązań. Tworzenie akcji - zawartość i kopiowanie do katalogu wyjściowego - zawsze kopiuj
źródło
Uważaj na ten problem ...
W moim przypadku wszystko zostało skonfigurowane poprawnie. Problem polega na tym, że użyłem Web Deploy w programie Visual Studio 2013, aby przesłać witrynę do WinHost.com i zresetować listy ACL na serwerze. To z kolei cofnęło wszelkie uprawnienia do folderów i plików - log4net nie mógł zapisać pliku.
Więcej na ten temat przeczytasz tutaj:
Jak zatrzymać Web Deploy / MSBuild przed zepsuciem uprawnień serwera
Poprosiłem tamtejszy zespół pomocy o zresetowanie list ACL, a następnie log4net zaczął pluć logami. :)
źródło
Zakładając, że masz zewnętrzny plik konfiguracyjny o nazwie log4net.config, który jest kopiowany do katalogu wdrażania, możesz go skonfigurować w następujący sposób:
using System; using System.Collections.Generic; using System.Windows.Forms; using System.Reflection; using log4net; namespace MyAppNamespace { static class Program { //declare it as static and public so all classes in the project can access it //like so: Program.log.Error("got an error"); public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program)); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { //configure it to use external file log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config")); //use it log.Debug("############# STARING APPLICATION #################"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormMain()); } } }
źródło
Oprócz tego miałem ten sam problem
w bieżącym projekcie miałem również następujący wiersz w projekcie referencyjnym:
Kiedy usunąłem tę linię w projektach, do których istnieją odniesienia, dzienniki zaczynają się pojawiać.
źródło
Możliwe jest również włączenie trybu debugowania dla
log4net
. Wstaw to do pliku App.config:i przynajmniej otrzymasz komunikaty o błędach, z których możesz wywnioskować, co dokładnie poszło nie tak. W moim przypadku po prostu zapomniał ustawić
Copy to output directory
sięCopy Always
.źródło
@Mitch, Okazuje się, że istnieje plik z deklaracją [assembly: ...], ale nie ma on właściwości ConfigFile.
Gdy dodałem go i wskazałem na Log.config, zaczął działać. Pomyślałbym, że będzie działać jak wszystkie inne sekcje konfiguracyjne (tj. AppSettings) i akceptować zewnętrzne pliki konfiguracyjne bez modyfikacji.
Nie mamy drugiego oświadczenia, o którym wspomniałeś, ponieważ opakowujemy go w globalnego dostawcę dziennika statycznego.
źródło
W moim przypadku otrzymałem ten komunikat o błędzie:
I
log4net.config
plik był w Visual Studio 2017 projektu, ale gdy sprawdziłem plikbin\Debug
folderze, nie mogłem go znaleźć.Moja oryginalna konfiguracja zespołu wyglądała następująco:
Po pewnym czasie badań zmieniam to na następujące i działa:
źródło
[zespół: log4net.Config.XmlConfigurator (ConfigFile = "Log4Net.config")]
zmień Copy to Output Dirctory na Copy, jeśli jest nowsza
źródło
Warto również zauważyć, że w aplikacji internetowej wygląda to w katalogu głównym, a nie w folderze bin, więc upewnij się, że tam umieściłeś plik konfiguracyjny.
źródło