【问题标题】:How to configure logging via log4net in an UWP App如何在 UWP 应用中通过 log4net 配置日志记录
【发布时间】:2018-10-31 21:52:21
【问题描述】:

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

我想通过 XML 配置文件中通常的 confi 部分来配置 log4net,但由于没有 app.config 文件,我无法在 UWP 项目中找到执行此操作的方法。

我应该把下面的部分放在哪里?

<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>

谢谢!

【问题讨论】:

    标签: c# logging uwp log4net log4net-configuration


    【解决方案1】:

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

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

    【讨论】:

    • 很好的答案。我唯一想说的是,您可能不希望日志转到ApplicationData.LocalFolder,因为它是backed up to the cloud。也许ApplicationData.LocalCacheFolderTemporaryFolder
    • 您好 MickyD,感谢您的评论。我已经更新了响应,因为我也认为它不应该默认上传到云端。
    【解决方案2】:

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

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

    Log4netXmlConfigurator 类可以通过其Configure 重载之一将这些设置作为StreamFileInfoXmlElement 接受。

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

    【讨论】:

    • Log4Net 不支持自定义 Log4Net.config 文件吗?
    • @DavidPrice 但是,您必须让 Log4net 知道在哪里可以找到此文件 - 一种方法是通过 app.config 文件中的设置。由于这个问题是关于 UWP 应用程序的,因此这是不可能的,因为 UWP 没有 app.config 文件的概念。我的回答显示了如何通过代码引用这样的自定义配置文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2018-10-12
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    相关资源
    最近更新 更多