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

时间:2018-10-31 21:52:22

标签: c# logging uwp log4net log4net-configuration

我有一个使用某些图书馆的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>

谢谢!

2 个答案:

答案 0 :(得分:3)

要完成 pfx 答案,如果您使用的是netStandard,则必须使用带有附加参数Configure的{​​{1}}重载。

我无法使用log4net.Repository.ILoggerRepository并切换到ConsoleAppender

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

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

RollingFileAppender

使用以下配置文件:

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();
        }
    }
}

答案 1 :(得分:2)

由于没有App.config文件,因此您将必须以编程方式配置Log4net

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

Log4net的{​​{3}}类可以通过其Stream重载之一将这些设置接受为FileInfoXmlElementConfigure

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