Log4Net создает файл, но не пишет в него - PullRequest
0 голосов
/ 04 декабря 2018

Недавно у меня возникла проблема с работой Log4Net ( описано здесь ), но после этого все было в порядке.

Я оставил это на некоторое время, потому что мне нужно было разработать некоторые модули, и яоставил лесозаготовки несколько позади.Теперь, когда я посмотрел, я даже попытался изменить имя файла журнала и местоположение (установить его статически), он создает его, но ничего не записывает в обоих случаях.

ЭтоМой конфигурационный файл log4Net:

<?xml version="1.0"?>
<configuration>    

<log4net>
<root>
 <level value="ALL" />
 <appender-ref ref="console" />
 <appender-ref ref="file" />
</root>
<appender name="console" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %level %logger - %message%newline" />
  </layout>
</appender>
<appender name="file" type="log4net.Appender.RollingFileAppender">
 <file value="ApplicationLogging.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>
</log4net>
</configuration>

Это мой Global.asax

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

 XmlConfigurator.Configure();            
 ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 logger.Info("Application started.");

Как я это заявляю:

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

Я иногда использую это так:

logger.Info("some logging here");

Или для ведения журнала контекста я бы использовал это так:

context.Database.Log = (dbLog => logger.Debug(dbLog));

Файлсоздается, но в него не записывается содержимое. Может кто-нибудь посоветовать мне, где или что искать?

ОБНОВЛЕНИЕ: Как предложено stuartd iдобавил это в web.config:

<appSettings>
 <add key="log4net.Internal.Debug" value="true"/>
</appSettings>

<system.diagnostics>
 <trace autoflush="true">
  <listeners>
    <add
        name="textWriterTraceListener"
        type="System.Diagnostics.TextWriterTraceListener"
        initializeData="C:\log4net.txt" />
  </listeners>
 </trace>
</system.diagnostics>

Который пишет следующее содержание (pastebin)

Обратите внимание, что я удалил первый раздел, который я не сделалне видел раньше, и я думаю, что это избыточно?

<!--<appender name="console" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %level %logger - %message%newline" />
  </layout>
</appender>-->

В любом случае, с этим или без него это не работает.

Вот вывод С первой частью, НЕ закомментированной (в исходном состоянии)

Я также попробовал следующее: https://logging.apache.org/log4net/release/config-examples.html https://csharp.today/log4net-tutorial-great-library-for-logging/

Я понятия не имею, почему он может его создать, но не писать в него ... Кажется, я не могу найти что-либо в Интернете, все вопросы касаются создания файла, а не записи в него.

Ответы [ 2 ]

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

+ 1 для включения журнала отладки / трассировки в ваш вопрос.
В этом журнале несколько раз появляется сообщение log4net: Configuring Repository [log4net-default-repository], которое выглядит как , конфигурация настраивается дважды , один раз черезXmlConfiguratorAttribute и второй раз при вызове XmlConfigurator.Configure();.

Проверка исходного кода XmlConfiguratorAttribute показывает, что он внутренне выполняет аналогичный вызов XmlConfigurator.Configure(...);

private void ConfigureFromFile(ILoggerRepository targetRepository, FileInfo configFile)
{
    if (m_configureAndWatch)
    {
        XmlConfigurator.ConfigureAndWatch(targetRepository, configFile);
    }
    else
    {
        XmlConfigurator.Configure(targetRepository, configFile);
    }
}

Вот что происходит.

Изначально XmlConfiguratorAttribute устанавливает регистраторы и вспомогательные устройства, как определено в файле log4net.config, и создает пустой файл ApplicationLogging.log.

Затем вызов XmlConfigurator.Configure(); перезаписывает эти регистраторы и приложения с конфигурацией, как в web.config ( является местоположением по умолчанию ), которое не содержит ничего, так как вы используете отдельныйlog4net.config file.
Из-за этого вы в конечном итоге не получаете Appender, и ничего не регистрируется.

Решение состоит в том, чтобы применить XmlConfiguratorAttribute или позвонить XmlConfigurator.Configure()* 1033.* с путем к файлу log4net.config (XmlConfigurator.Configure(new FileInfo("log4net.config"))), но не делает оба .

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

Пожалуйста, проверьте, есть ли у вашего приложения права на запись в папку назначения для файла журнала. Такие вещи иногда могут привести к реальной боли.

Кроме того, все остальное выглядит неплохо.

...