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

Cri*_*rsi 3 c# logging log4net log4net-configuration uwp

我有一个使用我的一些库的 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>
Run Code Online (Sandbox Code Playgroud)

谢谢!

Arn*_*lay 7

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

我一直无法使用ConsoleAppender并切换到DebugAppender.

你不能在 UWP 中使用相对路径,RollingFileAppender因为 log4net 没有权限在你的应用程序的安装位置创建文件。我认为它可以使用完整路径,但我看到了一些权限问题(您应该为此激活 log4net 的调试模式)。

最后,我还制作了一个自定义 Appender,它在您的应用程序的本地存储中写入文件。这是应该为生产使用而增强的代码。

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用以下配置文件:

<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>
Run Code Online (Sandbox Code Playgroud)