Konfiguracja Log4Net w zewnętrznym pliku nie działa

Używamy log4net i chcemy określić jego konfigurację w zewnętrznym pliku konfiguracyjnym (tak jak to zrobiliśmy w innych sekcjach). W tym celu zmieniliśmy sekcję log4net w aplikacji.config to:

...
<section name="log4net" 
     type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...

I w Dzienniku.Plik konfiguracyjny (ten sam katalog co aplikacja.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, gdy uruchamiamy aplikację, nie jest tworzony plik dziennika(i nie jest rejestrowane). Nie ma żadnych komunikatów o błędach wysyłanych do konsoli.

Jeśli przeniesiemy zawartość dziennika.plik konfiguracyjny powrót do aplikacji.config (zastąpienie pierwszej linii kodu powyżej), działa zgodnie z oczekiwaniami. Jakiś pomysł, dlaczego nie działa w zewnętrznym pliku?

Author: maytham-ɯɐɥʇʎɐɯ, 2009-01-15

12 answers

Czy masz następujący atrybut w pliku AssemblyInfo.cs:

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

I kod w ten sposób na początku każdej klasy wymagającej funkcji logowania:

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

Mam wpis na blogu zawierający to i inne informacje tutaj .

 103
Author: Mitch Wheat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-07 10:29:06

Istnieje wada Otwarta w tej kwestii. Log4Net nie obsługuje atrybutu configSource elementów konfiguracyjnych. Aby użyć wyłącznie pliku konfiguracyjnego używasz log4net.Klucz konfiguracji w appSettings.

Krok 1: Dołącz normalną definicję sekcji konfiguracji:

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

Krok 2: Użyj magicznego log4net.Klucz konfiguracji w appSettings.

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

Krok 3: Dodaj łatkę poprawiającą obsługę configSource.

 34
Author: Precipitous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-25 20:10:16

Krok, który został pominięty to

log4net.Config.XmlConfigurator.Configure(); 

Spowoduje to użycie configSource. Upewnij się, że wywołasz go raz, zanim wywołasz GetLogger ();

 23
Author: Greg Domjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-11 21:09:40

Upewnij się, że Twój log4net.plik konfiguracyjny ma następujące właściwości:

Build Action: Content

Kopiuj do katalogu wyjściowego: Kopiuj zawsze

 18
Author: Lewis Moten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 12:38:56

Albo użyć,

<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="log4net.Config" value="Log4Net.config" />
</appSettings>

Lub po prostu

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config"));

W obu przypadkach plik Log4Net.config, powinien być tam w katalogu wyjściowym. Możesz to zrobić, ustawiając Log4Net.właściwości pliku konfiguracyjnego w Eksploratorze rozwiązań. Tworzenie akcji-Content i kopiowanie do katalogu wyjściowego-Copy always

 9
Author: Byju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-25 13:46:18

Zakładając, że masz zewnętrzny plik konfiguracyjny o nazwie log4net.config skopiowany do katalogu deploy można skonfigurować tak:

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());
        }
    }
}
 1
Author: JJ_Coder4Hire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-24 10:29:52

Uważaj na ten problem...

W moim przypadku wszystko zostało poprawnie skonfigurowane. Problem polega na tym, że użyłem Web Deploy wewnątrz Visual Studio 2013, aby przesłać stronę do WinHost.com i resetuje ACLs na serwerze. To z kolei unieważniło wszystkie Uprawnienia folderów i plików-log4net nie mógł zapisać pliku.

Możesz przeczytać więcej na ten temat tutaj:

Jak zatrzymać Web Deploy / MSBuild od zakłócania uprawnień serwera

I asked the zespół wsparcia tam, aby zresetować ACLs, a następnie log4net zaczął pluć dzienniki. :)

 1
Author: Leniel Maccaferri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-07 18:26:44

Możliwe jest również włączenie trybu debugowania dla log4net. Wstaw to do aplikacji.plik konfiguracyjny:

 <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
 </appSettings>
 <system.diagnostics>
      <trace autoflush="true">
      <listeners>
           <add
             name="textWriterTraceListener"
             type="System.Diagnostics.TextWriterTraceListener"
             initializeData="link\to\your\file.log" />
      </listeners>
      </trace>
 </system.diagnostics>

I otrzymasz przynajmniej komunikaty o błędach, z których możesz wyciągnąć, co dokładnie poszło nie tak. W moim przypadku po prostu zapomniałem ustawić Copy to output directory na Copy Always.

 1
Author: waka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-31 08:22:02

@ Mitch, okazuje się, że jest plik z [assembly:...] deklaracja, ale nie posiada właściwości ConfigFile.

Raz dodałem i wskazałem na Log.config, zaczęło działać. Myślałem, że to będzie działać jak wszystkie inne sekcje config (ie AppSettings) i akceptować zewnętrzne pliki config bez modyfikacji.

Nie mamy drugiego Oświadczenia, o którym wspomniałeś, ponieważ zawijamy je w globalnego dostawcę dziennika statycznego.

 0
Author: Robert Wagner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-15 08:21:07

Miałem ten sam problem, poza tym miałem

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

W uruchomionym projekcie miałem również następującą linijkę w projekcie referencyjnym:

[assembly: log4net.Config.XmlConfigurator]

Kiedy usunąłem ten wiersz w odwołanych projektach, logi zaczynają się pojawiać.

 0
Author: TheGuest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-21 14:03:03

W moim przypadku dostałem komunikat o błędzie:

log4net: config file [C:\........\bin\Debug\log4net.config] not found.

Oraz log4net.config plik był w projekcie Visual Studio 2017, ale kiedy sprawdziłem plik w bin\Debug folder nie mogłem go znaleźć.

Mój oryginalny montaż był taki:

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

Po pewnym czasie badań, zmieniam go na następujący i działa:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"..\..\log4net.config", Watch = true)]
 0
Author: maytham-ɯɐɥʇʎɐɯ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-16 22:42:07
  1. Dodaj następujący tekst do AssemblyInfo.cs

[Montaż: log4net.Config.XmlConfigurator(ConfigFile = " Log4Net.config")]

  1. Upewnij się, że log4net.config jest zawarty w projekcie
  2. we właściwościach log4net.config

Zmień Copy to Output Dirctory na Copy if newer

  1. Double check log level level value= " ALL "
 0
Author: e03050,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-10 13:16:39