如何在 UWP 应用程序中通过 log4net 配置日志记录

How to configure logging via log4net in an UWP App

我有一个 UWP 应用程序使用了我的一些库。 此类库使用 log4net 进行日志记录,并在许多项目中共享,而不仅仅是 UWP。

我想通过 XML 配置文件中的常规 confi 部分配置 log4net,但我找不到在 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>

谢谢!

因为没有 App.config 文件,您将不得不以编程方式配置 Log4net

您可以将设置存储在本地文件(或嵌入式资源)中,并在应用程序启动时读取这些设置;参考:Create and read a local file.

Log4netXmlConfigurator class 可以通过其 StreamFileInfoXmlElement 之一接受这些设置 Configure 重载。

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

要完成 pfx 答案,如果您使用的是 netStandard,则必须使用带有附加参数 log4net.Repository.ILoggerRepository.[=17 的 Configure 重载=]

我无法使用 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>