Почему все мои уровни log4net ложные? - PullRequest
30 голосов
/ 28 декабря 2011

Я использую log4net в моем проекте ASP.NET MVC3, но все свойства журналирования, такие как IsDebugEnabled == false

В моем AssemblyInfo у меня есть:

[assembly: XmlConfigurator(Watch = true)]

Вмой класс журнала у меня есть

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

Мои связанные настройки в Web.Config:

<?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>

Я уже разочаровался до такой степени, что просто хотел сделать

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


    Logger.IsDebugEnabled = true;
}

Однако, конечно, Logger.IsDebugEnabled не имеет никаких сеттеров: /

Что мне нужно сделать, чтобы эта чертова штука заработала?

Ответы [ 13 ]

29 голосов
/ 02 апреля 2013

У меня была такая же проблема. Я могу обойти это, используя приведенную ниже строку кода в методе Application_Start в Global.asax.cs (при условии, что это веб-приложение .Net)

log4net.Config.XmlConfigurator.Configure();
18 голосов
/ 25 июня 2013

Измените следующую строку в AssemblyInfo.cs:

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

и поместите конфигурацию log4net в этот файл.

6 голосов
/ 28 декабря 2011

Log4net ожидает, что его раздел конфигурации не будет сгруппирован. Потому что в вашей конфигурации вы поместили раздел log4net внутри ApplicationSettingsGroup (applicationSettings) log4net не найдет его конфигурацию. Вы можете переместить раздел log4net за пределы группы или указать группу при вызове XmlConfigurator.Configure:

XmlConfigurator.Configure(
    ConfigurationManager.GetSection(
        "applicationSettings/log4net") as XmlElement);
4 голосов
/ 13 октября 2016

Кажется, вы пропустили изменения настроек свойства файла конфигурации Копировать в выходной каталог = "Копировать всегда" Пожалуйста, проверьте эту настройку изображения для более подробной информации. Настройки файла конфигурации Свойства

3 голосов
/ 02 января 2012

Уровни журнала чувствительны к регистру, поэтому вместо:

<level value="All" />

должно быть

<level value="ALL" />

Мне также гораздо проще создать отдельный файл конфигурации log4net. Создайте файл с именем log4net.config и установите для свойства Копировать в каталог вывода значение Копировать всегда - (копирование конфигурации из файла App.config в этот файл)

Тогда при настройке конфигурации используйте:

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

2 голосов
/ 28 декабря 2011

Я никогда раньше не видел <level value="All" />, обычно я просто устанавливаю value на один из уровней (так как они включают уровни над ними или под ними, так как они перечислены в вашей конфигурации, в стек уровней). Примерно так:

<level value="DEBUG" />

Вы также можете попробовать протестировать его с помощью явного регистратора, просто чтобы увидеть, может ли проблема быть в чем-то другом. Нечто простое, смежное с appender узлами, вроде этого:

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

Затем, когда вы тестируете его в своем коде, вы создадите логгер следующим образом:

LogManager.GetLogger("Log4NetTEST");
1 голос
/ 31 июля 2018

Вы не смогли инициализировать log4net в вашем приложении. Это можно явно инициализировать, поместив ниже в 'Application_Start',

log4net.Config.XmlConfigurator.Configure();
1 голос
/ 16 ноября 2015

Измените следующую строку в AssemblyInfo.cs:

[сборка: log4net.Config.XmlConfigurator (Watch = true)]

Убедитесь, что добавлена ​​log4net dll, а также поместите конфигурацию log4net в файл web.config как

<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>
0 голосов
/ 18 декабря 2018

У меня была такая же проблема. Я использовал отдельный файл и назвал его log.config. Все, что мне нужно было сделать, это пометить свойство файла «Копировать в выходной каталог» в «Копировать всегда» в обозревателе решений в Visual Studio. Это помогло мне.

0 голосов
/ 24 марта 2018

В моем случае это было связано с тем, что <configSections> не был первым тегом раздела <configuration>.Это предотвращает распознавание имени раздела log4net.Таким образом, экземпляр журнала показывает IsDebugEnabled и все остальные в качестве логического значения по умолчанию false.

Это должно быть так.

<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>
...