Log4Net нигде не может найти файл журнала

Я следовал многим различным руководствам по настройке log4net, он запущен и работает, но я нигде не могу найти файл журнала ...

Вот как выглядит моя конфигурация:

Web.Config

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<log4net debug="true">
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="C:\\temp\\Log.txt" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="10MB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="RollingLogFileAppender" />
    </root>
</log4net>

Глобальный.asax:

XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config")));
//XmlConfigurator.Configure();

StartUp.cs

//[assembly: XmlConfigurator(ConfigFile = "Web.config", Watch = true)]
[assembly: XmlConfigurator(Watch = true)]

Декларация

readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

логирование

 BasicConfigurator.Configure();
 logger.Info("Info logging ...");
 logger.Error("Homepage loading test logging ...");

Где значение моего файла: <file value="C:\\temp\\Log.txt" />

Я пробовал несколько путей и прокомментировал то, что выше, но безуспешно.

Что я делаю неправильно?

ОБНОВЛЕНИЕ: Как предложил John H, я попытался настроить и вызвать регистратор в методе Application_Start и попробовал с ним несколько альтернативных конфигураций, но безуспешно. Вот 2 скриншота с информацией об отладке:

Основные свойства:

введите здесь описание изображения

Ниже приведены свойства регистратора:

введите здесь описание изображения

Что я делаю неправильно?


person Dimitri    schedule 17.08.2018    source источник
comment
Не могли бы вы прочитать этот stackoverflow.com/questions/51866569/, и его вопрос: посмотреть, решит ли это вашу проблему? Они звучат похоже.   -  person John H    schedule 17.08.2018
comment
Я пробовал предложенное предложение в нескольких сценариях (пробовал переключаться с помощью кода в комментарии выше), но я не могу найти файл журнала нигде на своем ПК (искал его также по имени и расширению). Я обновлю исходный пост скриншотами отладки на самом объекте/экземпляре регистратора, если это поможет.   -  person Dimitri    schedule 20.08.2018


Ответы (2)


Итак, я заставил его работать, следуя этому руководству: log4net-guide-dotnet-logging

  • Я создал файл log4net.config с содержимым, как показано в руководстве.
  • б/у [assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

Называл так:

ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        logger.Info("Application started.");
  • файл создается, а содержимое также регистрируется. Я собираюсь сравнить содержимое конфигурационных файлов и посмотреть, есть ли там разница, и постепенно сравнивать все, пока не найду причину, из-за которой он не работает.

Спасибо за помощь мне! С уважением

person Dimitri    schedule 22.08.2018
comment
Рад, что вам удалось это исправить, Дмитрий, и спасибо за публикацию вашего ответа. :) - person John H; 22.08.2018
comment
Спасибо за вашу поддержку, Джон, очень ценю это! - person Dimitri; 23.08.2018

Из ваших скриншотов мы видим, что ваш регистратор не инициализируется с вашей конфигурацией, потому что IsDebug это false. Одна вещь, которую я заметил на вашем скриншоте, это то, что вы пытаетесь передать путь к Web.config непосредственно методу Configure(). Я понимаю, что это может быть попыткой решить проблему, поэтому вы, возможно, уже попробовали мое следующее предложение, но вызов Configure() тем способом, который у вас есть сейчас, не сработает, потому что Web.config не опубликован в вашей папке bin\debug. Он будет называться Web.projectname.config. Вызов

XmlConfigurator.Configure()

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

using log4net;

protected void Application_Start(object sender, EventArgs e)
{
    // Initialising configuration before requesting a logger.
    XmlConfigurator.Configure();

    // Requesting a logger only after the configuration has been initialised.
    var logger = LogManager.GetLogger(typeof(Global));
    logger.Info("Application started.");
}

Я не уверен, что это будет иметь какое-либо значение, но ваша конфигурация выглядит нормально для меня.

Но, проверив свойство IsDebug в регистраторе, вы, по крайней мере, сможете сказать, была ли вообще прочитана конфигурация.

Изменить: еще одна вещь: убедитесь, что у приложения есть права на запись в файл. Из документации:

RollingFileAppender расширяет FileAppender и имеет такое же поведение при открытии файла журнала. Приложение сначала попытается открыть файл для записи при вызове ActivateOptions(). Обычно это происходит во время настройки. Если файл не может быть открыт для записи, приложение будет пытаться снова открыть файл каждый раз, когда сообщение регистрируется в приложении. Если файл не может быть открыт для записи, когда сообщение регистрируется, то сообщение будет отброшено этим приложением.

person John H    schedule 20.08.2018
comment
спасибо за ваше предложение, я только что попробовал его с помощью XmlConfigurator.Configure(); вместо того, что у меня было, но 1 вещь, которую я не могу понять, это использование Global, я не могу ссылаться на нее, я пытался использовать MethodBase.GetCurrentMethod().DeclaringType и MvcApplication или даже HttpApplication, но IsDebug продолжает быть False ... - person Dimitri; 21.08.2018
comment
@Dimitri Если вы посмотрите на свой Global.asax.cs, это должно быть имя класса, который наследуется от HttpApplication (например, public class WebApiApplication : System.Web.HttpApplication). Это MvcApplication в вашем случае? Кроме того, на втором снимке экрана вы можете проверить список Appenders, чтобы увидеть, что там? - person John H; 21.08.2018
comment
это правильно, это действительно MvcApplication. Я установил этот тип следующим образом: LogManager.GetLogger(typeof(MvcApplication)); и я вижу, что Appenders не дали результатов, он пустой. Я продолжаю искать и пробовать предложения, спасибо за уже оказанную помощь, Джон! - person Dimitri; 22.08.2018