Log4Net на моем .Net сайте при отладке всегда показывает значение IsErrorEnabled как FALSE - PullRequest
0 голосов
/ 06 декабря 2018

Я пытался записать ошибку на своем веб-сайте .Net в базу данных SQL с помощью Log4Net AdoNetAppender, но сообщение об ошибке не регистрируется в базе данных.Похоже, AdoNetAppender не включается и не читает.При отладке я заметил, что Logger.Log показывает все значения своих свойств как false.т.е. IsErrorEnabled / IsDebugEnabled / IsFatalEnabled / IsInfoEnabled / IsWarnEnabled все как ложные.

Используемая версия log4net.dll: 2.0.8.0

Нажмите здесь, чтобы посмотреть изображение свойств объекта

Код logging.cs следующий:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Utility.Library
{
    public class Logging
    {

        public static class Logger
        {
            public static ILog Log = LogManager.GetLogger(typeof(SharedMethods));
        }

        public static class LogException
        {

            private static StringBuilder sessionJobLogBuilder = new StringBuilder();

            public static void LogError(string sMsg, Exception ex)
            {

                Logger.Log.Error(sMsg, ex);
                sessionJobLogBuilder.AppendLine(sMsg + Environment.NewLine);
                sessionJobLogBuilder.AppendLine(ex.ToString() + Environment.NewLine);

            }

            public static void LogInfo(string sMsg)
            {
                Logger.Log.Info(sMsg);
                sessionJobLogBuilder.AppendLine(sMsg + Environment.NewLine);
            }

        }

    }

}

И ниже app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, 
   System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="data source=xxx\xxx;
    initial catalog=xxx;integrated security=false;
    persist security info=True;User ID=xxx;Password=xxx" />
      <commandText value="EXECUTE [dbo].[WriteLogEntry] @App, @Module, @Ver, @Computer, @UserID, @Level, @Message, @Exception" />
      <parameter>
        <parameterName value="@App" />
        <dbType value="String" />
        <size value="30" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%App" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Module" />
        <dbType value="String" />
        <size value="200" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%Module" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Ver" />
        <dbType value="String" />
        <size value="20" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%Ver" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Computer" />
        <dbType value="String" />
        <size value="15" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%Computer" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@UserID" />
        <dbType value="String" />
        <size value="30" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%UserID" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Level" />
        <dbType value="Int32" />
        <layout type="log4net.Layout.PatternLayout" />
      </parameter>
      <parameter>
        <parameterName value="@Message" />
        <dbType value="String" />
        <size value="2000" />
        <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>
    <root>
      <level value="ALL" />
      <appender-ref ref="AdoNetAppender"/>
    </root>
  </log4net>
</configuration>

Но свойства Logger.Log на всех уровнях отображаются как ложные.

1 Ответ

0 голосов
/ 07 декабря 2018

Из вашего комментария, который я прочитал, у вас есть отдельный файл app.config и класс Logger, определенные в отдельной сборке.

Веб-сайт ASP.NET рассматривает только файл web.config.
Ваш файл app.config не загружается, поэтому конфигурация Log4net не применяется.

Один из способов решить эту проблему - преобразовать файл app.config в отдельный файл конфигурации Log4net.и загрузить это явно.

  1. Переместите содержимое <log4net> ... </log4net> из файла app.config в отдельный файл ( по соглашению с именем Log4net.config) вкорень проекта вашего веб-сайта.
    Элемент <log4net> должен быть корневым элементом xml в этом файле.

  2. Удалите [assembly: log4net.Config.XmlConfigurator(Watch = true)] из вашего проекта Logger.

  3. Добавьте следующий код в Application_Start в Global.asax проекта веб-сайта, чтобы обеспечить загрузку конфигурации log4net на этапе запуска сайта.

    void Application_Start(object sender, EventArgs e)    
    {
        ILoggerRepository repository = log4net.LogManager.GetRepository(Assembly.GetExecutingAssembly());
        XmlConfigurator.Configure(repository, new FileInfo(Server.MapPath("log4net.config")));
    
        // Remaining startup code.
    }
    

У меня есть следующее log4net.config в корне проекта моего веб-сайта (около web.config) сh просто RollingFileAppender, но концепция та же самая.

<log4net>
    <appender name="file" type="log4net.Appender.RollingFileAppender">
        <param name="ImmediateFlush" value="true" />
        <file value="Log.log" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="5" />
        <maximumFileSize value="10MB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
        </layout>
    </appender>
    <root>
        <level value="ERROR" />
        <appender-ref ref="file" />
    </root>
</log4net>


С вашей настройкой AdoNetAppender в моем Log4net.config ожидаемые значения для IsDebugEnabled, IsErrorEnabled и т. д.


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