Log4net не работает - asp.net mvc

Моя конфигурация log4net такая,

    <?xml version="1.0" encoding="utf-8" ?>
     <log4netConfiguration>
     <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <appSettings>
    <add key="log4net.Config" value="log4net.config" />
  </appSettings>
  <log4net>   
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="C:\my_logs/my_web_logs/my_log_%date{ddMMyyyy}.log" />
      <appendToFile value="true" />      
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="30MB" />
      <datePattern value="yyyyMMdd" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%4t %d{ABSOLUTE} %-5p %m%n"/>
        <!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline" />-->
      </layout>
    </appender>   
    <root>
      <level value="INFO" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>
</log4netConfiguration>

У меня есть класс помощника Logger, как,

public static class Logger
    {
        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        public static log4net.ILog Log
        {            
            get { return log; }
        }
    }

В моей информации о сборке у меня есть эта запись,

// Configure log4net using the .config file 
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

log4net.config - это файл конфигурации, добавленный в веб-проект.

В коде, который я регистрирую, используя класс logger,

Logger.Log.Info("User visits Sign In Page.");

Регистрация работала, когда я установил вышеупомянутую настройку. Но вдруг регистрация перестала работать. Но когда я создал новый веб-сайт asp.net mvc с указанными выше настройками, регистрация работала для этого. Я пробовал с IIS Express и локальным IIS. В обоих случаях ведение журнала работает для тестового приложения, которое я создал.

Я не могу понять, почему это не логи? Как я могу диагностировать это? Каковы возможные проблемы?

3 ответа

Решение

Решил сам, причина была "по какой-то причине", конфигурация log4net не была загружена из информации о сборке. Тем не менее я не знаю, почему это происходит.

Я перепробовал так много исправлений, предложенных разными постами. Наконец-то исправили проблему. Решение, упомянутое в этом посте, помогло мне решить проблему.

Я добавил следующую конфигурацию,

    <!--These settings load the log4net configuration.-->
        <add key="log4net.Config" value="log4net.config"/>
        <add key="log4net.Config.Watch" value="True"/>

Начинается регистрация!

Затем я удалил следующую строку из информации о сборке,

// Configure log4net using the .config file 
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

Я обнаружил, что log4net не будет загружать конфигурацию webconfig, если вы не вызовете log4net.Config.XmlConfigurator.Configure(); на старте.

    protected void Application_Start()
    {
        // your other codes

        log4net.Config.XmlConfigurator.Configure(); // must have this line
        Logger = log4net.LogManager.GetLogger(typeof(MvcApplication));

    }

Причина в том, что Log4Net пытается загрузить конфигурацию из сборки, которая сначала использует LogManager.GetLogger(), Если это одна из ваших библиотек классов, она просто проигнорирует атрибут во всех других сборках.

Самый простой способ исправить это - вызвать LogManager в вашем стартовом файле (как Program.cs или же Global.asax):

var logger = LogManager.GetLogger(typeof(Program));
logger.Info("Application started.");

//rest of app init.

Делая это, вы получите ожидаемое поведение с атрибутом сборки.

У меня была аналогичная проблема: я не получал никаких журналов, когда запускал свою сборку из IIS или IISExpress.

Однако ни один из приведенных выше ответов не помог мне.

В моем случае решение заключалось в том, чтобы указать путь к файлу конфигурации как абсолютный путь. Оказалось, что IISExpress не устанавливает текущий каталог в папку bin, и log4net не может найти файл конфигурации, поэтому мне пришлось использовать этот обходной путь:

        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        // remove file:// part from uri
        UriBuilder ub = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(ub.Path);

        var fi = new FileInfo(Path.Combine(Path.GetDirectoryName(path), "Logging.config.xml"));

        if (fi.Exists)
        {
            log4net.Config.XmlConfigurator.ConfigureAndWatch(fi);

            var logger = log4net.LogManager.GetLogger(typeof(WebApiApplication));
            logger.Info("Application started.");
        }
        else
        {
            throw new FileNotFoundException("log4net config file not found", fi.FullName);
        }
Другие вопросы по тегам