it-swarm.dev

Dlaczego wszystkie moje poziomy log4net są fałszywe?

Używam log4net w moim projekcie ASP.NET MVC3, ale wszystkie właściwości rejestrowania, takie jak IsDebugEnabled == false

W moim AssemblyInfo mam:

[Assembly: XmlConfigurator(Watch = true)]

W mojej klasie dziennika mam

public Log4NetLogger()
{
    log4net.Config.XmlConfigurator.Configure();
    Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}

Moje powiązane elementy konfiguracyjne w Web.Config to:

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.Microsoft.com/fwlink/?LinkId=152368
  -->
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
       </sectionGroup>
  </configSections>

    <log4net debug="false">
      <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
        <bufferSize value="100" />
        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <connectionString value="{removed}" />
        <commandText value="INSERT INTO Logging ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
        <parameter>
          <parameterName value="@log_date" />
          <dbType value="DateTime" />
          <layout type="log4net.Layout.RawTimeStampLayout" />
        </parameter>
        <parameter>
          <parameterName value="@thread" />
          <dbType value="String" />
          <size value="255" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%thread" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@log_level" />
          <dbType value="String" />
          <size value="50" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@logger" />
          <dbType value="String" />
          <size value="255" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@message" />
          <dbType value="String" />
          <size value="4000" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@exception" />
          <dbType value="String" />
          <size value="2000" />
          <layout type="log4net.Layout.ExceptionLayout" />
        </parameter>
      </appender>
      <!--Possible levels:-->
      <!--DEBUG-->
      <!--INFO-->
      <!--WARN-->
      <!--ERROR-->
      <!--FATAL-->
      <root>
        <level value="All" />
        <appender-ref ref="AdoNetAppender" />
      </root>
    </log4net>

  </applicationSettings>

</configuration>

Sfrustrowałem się już do momentu, gdy chciałem to zrobić

public Log4NetLogger()
{
    Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);


    Logger.IsDebugEnabled = true;
}

Jednak oczywiście Logger.IsDebugEnabled nie ma żadnych ustawników: /

Co muszę zrobić, aby ta cholerna rzecz zadziałała?

29
John Smith

Miałem ten sam problem. Zajmuję się tym, używając poniższej linii kodu w metodzie Application_Start w Global.asax.cs (zakładając, że jest to aplikacja internetowa .Net)

log4net.Config.XmlConfigurator.Configure();
29
Ben Cameron

Zmień linię na następującą w AssemblyInfo.cs:

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

i umieść konfigurację log4net w tym pliku.

18
Azimuth

Log4net oczekuje, że jego sekcja konfiguracji nie zostanie pogrupowana. Ponieważ w twojej konfiguracji umieściłeś sekcję log4net wewnątrz funkcji ApplicationSettingsGroup (applicationSettings) log4net nie znajdzie swojej konfiguracji. Możesz przenieść sekcję log4net poza grupę lub określić grupę podczas wywoływania XmlConfigurator.Configure:

XmlConfigurator.Configure(
    ConfigurationManager.GetSection(
        "applicationSettings/log4net") as XmlElement);
6
nemesv

Wygląda na to, że pominąłeś zmiany właściwości pliku konfiguracyjnego Kopiuj do katalogu wyjściowego = „Kopiuj zawsze” Sprawdź ten obraz ustawień, aby uzyskać więcej szczegółów. Ustawienia pliku konfiguracji Właściwości

4
Manoj P

W poziomach dziennika rozróżniana jest wielkość liter, więc zamiast:

<level value="All" />

powinno być

<level value="ALL" />

Łatwiej mi też stworzyć osobny plik konfiguracyjny log4net. Utwórz plik o nazwie log4net.config i ustaw właściwość Kopiuj do katalogu wyjściowego na Kopiuj zawsze - (kopiowanie konfiguracji z App.config do tego pliku)

Następnie podczas ustawiania konfiguracji użyj:

XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));

3
William

Nigdy wcześniej nie widziałem <level value="All" />, zwykle ustawiam value na jeden z poziomów (ponieważ zawierają poziomy nad nimi lub poniżej, tak jak je masz w swojej konfiguracji, w stosie poziomów). Coś takiego:

<level value="DEBUG" />

Możesz także spróbować przetestować go za pomocą jawnego programu rejestrującego, aby sprawdzić, czy problem może być inny. Coś prostego w sąsiedztwie węzła appender w następujący sposób:

<logger name="Log4NetTEST" >
  <level value="DEBUG" />
  <appender-ref ref="AdoNetAppender" />
</logger>

Następnie podczas testowania go w kodzie tworzysz logger w następujący sposób:

LogManager.GetLogger("Log4NetTEST");
2
David

Zmień linię na następującą w AssemblyInfo.cs:

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

Upewnij się, że dll log4net został dodany, a także skonfiguruj log4net w pliku web.config jako 

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler" />
  </configSections>
  <log4net>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileAppender" />
    </root>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="C:\LOGS\IDMUserRoleManagement\IDMUserRoleManagement.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="1000KB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d{yyyy-MM-ddTHH:mm:ss} %-5p [%t] - %m%n" />
      </layout>
    </appender>
  </log4net>
</configuration>
1
vineel

jeśli plik dziennika klasy (Log4NetLogger) znajduje się w pojedynczej bibliotece klas, to kod: [Zgromadzenie: log4net.Config.XmlConfigurator (C .... powinien znajdować się w tej samej bibliotece klasy.

na przykład: lib 1: my.web (projekt mvc) lib 2: my.common (projekt biblioteki klas)

jeśli zawijasz kod logmanagera w my.common, to „[Zgromadzenie: log4net.Config.XmlConfigurator (C ...” POWINIEN BYĆ W moim.wspólnym, jeśli umieścisz go w my.web, nie zadziała!

Edytować:

Wykorzystanie wszystkich plików konfiguracyjnych (app.config, web.config, log4net.config itp.) Jest oparte na kontekście. Więc jeśli aplikacja wywołuje bibliotekę klas, plik konfiguracyjny, który zostanie użyty, to .Config w projekcie aplikacji, a nie biblioteka klas. 

Innym przykładem jest to, że jeśli testujesz aplikację w kontekście, kontekstem jest projekt Test jednostki i to, który plik konfiguracyjny zostanie użyty, a nie konfiguracja aplikacji. 

0
ibamboo

Możesz dodać starą dobrą diagnostykę systemu, aby dowiedzieć się, dlaczego log4net nie działa.

Dodaj to do swojej aplikacji lub pliku konfiguracyjnego sieci i sprawdź plik log.txt:

<system.diagnostics>
  <trace autoflush="true" indentsize="4">
    <listeners>
      <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/>
      <add name="textWriterListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="log.txt"/>
      <remove name="Default"/>
    </listeners>
  </trace>
</system.diagnostics>

To był mój przypadek:

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

Musiałem zmienić, aby skopiować właściwości log4net.config do zawsze kopiuj, jak wyjaśniono w innej odpowiedzi.

0
live-love

Nie powinieneś inicjować log4net w swojej aplikacji. Można to zainicjować jawnie, umieszczając poniżej „Application_Start”,

log4net.Config.XmlConfigurator.Configure ();

0
Ramesh B

Brakuje znacznika otwarcia dla zmiennej applicationSettings. To może być przyczyna

0
hounvs

Nie ma settera dla IsDebugEnabled, ponieważ jest tylko do odczytu.

Użyj log4net.Config.XmlConfigurator.Configure (); w dowolnej metodzie przed użyciem dziennika

i w app.Config ustawienie powinno być:

    <root>
      <level value="ALL" />
      <appender-ref ref="AppenderName" />
    </root>
0
tHiNk_OuT_oF_bOx

W moim przypadku wynikało to z faktu, że <configSections> nie był pierwszym znacznikiem sekcji <configuration>. Zapobiega to rozpoznaniu nazwy sekcji log4net. Tak więc instancja dziennika pokazuje IsDebugEnabled i wszystkie inne jako domyślną wartość logiczną false. 

Tak powinno być. 

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" />    
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
<configuration>
0
Mahendra

Miałem ten sam problem. Używałem osobnego pliku i nazwałem go log.config. Wszystko, co musiałem zrobić, to oznaczyć właściwość pliku „Kopiuj do katalogu wyjściowego” na „Kopiuj zawsze” w Eksploratorze rozwiązań w Visual Studio. To mnie zmyliło.

0
Eduardo Bottcher