Как настроить ведение журнала через log4net в приложении UWP - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть приложение UWP, которое использует некоторые из моих библиотек. Такие библиотеки используют log4net для целей регистрации и совместно используются несколькими проектами, а не только UWP.

Я бы хотел настроить log4net через обычный раздел конфигурации в файле конфигурации XML, но я не могу найти способ сделать это в проекте UWP, так как нет файла app.config.

Куда мне поместить следующий раздел?

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

    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
        <file value="log\mylog.log" />
        <appendToFile value="true" />
        <maximumFileSize value="2000KB" />
        <maxSizeRollBackups value="20" />

        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date - %message%newline" />
        </layout>
    </appender>

    <root>
        <level value="INFO" />
        <appender-ref ref="Console" />
        <appender-ref ref="RollingFile" />
    </root>
</log4net>

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Для завершения ответа pfx , если вы используете netStandard, вам придется использовать перегрузки Configure с дополнительным параметром log4net.Repository.ILoggerRepository.

Я не смог использовать ConsoleAppender и переключиться на DebugAppender.

Вы не можете использовать относительный путь в UWP с RollingFileAppender, так как log4net не будет иметь разрешения на создание файла в месте установки вашего приложения. Я думаю, что он мог бы работать с полным путем, но я видел некоторые проблемы с разрешениями (вы должны активировать режим отладки log4net для этого).

Наконец, я также создал Custom Appender , который записывает файл в Local Storage вашего приложения. Вот код, который должен быть улучшен для производственного использования.

namespace AppWithLog4net
{
    public class LocalStorageFileAppender : log4net.Appender.TextWriterAppender
    {

        private Stream m_stream;

        public LocalStorageFileAppender() : base() {  }

        protected override void PrepareWriter()
        {
            IAsyncOperation<Windows.Storage.StorageFile> task = Windows.Storage.ApplicationData.Current.LocalCacheFolder.CreateFileAsync("localStorage.log", 
                                                                            Windows.Storage.CreationCollisionOption.GenerateUniqueName);
            Windows.Storage.StorageFile file = task.GetAwaiter().GetResult();
            m_stream = file.OpenStreamForWriteAsync().Result;

            QuietWriter = new log4net.Util.QuietTextWriter(new StreamWriter(m_stream, Encoding.UTF8), ErrorHandler);
            WriteHeader();
        }

        protected override void Reset()
        {
            m_stream.Dispose();
            m_stream = null;
            base.Reset();
        }
    }
}

Со следующим файлом конфигурации:

<log4net debug="true">
  <appender name="Console" type="log4net.Appender.DebugAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date - %message%newline" />
    </layout>
  </appender>

  <appender name="LocalStorageFile" type="AppWithLog4net.LocalStorageFileAppender, AppWithLog4net">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date - %message%newline" />
    </layout>
  </appender>

  <root>
    <level value="INFO" />
    <appender-ref ref="Console" />
    <appender-ref ref="LocalStorageFile" />
  </root>
</log4net>
0 голосов
/ 09 ноября 2018

Поскольку файла App.config нет, вам придется настроить Log4net программно.

Вы можете сохранить настройки в локальном файле (или встроенном ресурсе) и прочитать их при запуске приложения; ссылка: Создать и прочитать локальный файл .

Класс

Log4net * XmlConfigurator может принять эти настройки как Stream, FileInfo или XmlElement через одну из своих Configure перегрузок.

log4net.Config.XmlConfigurator.Configure(XmlElement config);
log4net.Config.XmlConfigurator.Configure(Stream config);
log4net.Config.XmlConfigurator.Configure(FileInfo config);
...