Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在UWP应用程序中通过log4net配置日志记录_C#_Logging_Uwp_Log4net_Log4net Configuration - Fatal编程技术网

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

C# 如何在UWP应用程序中通过log4net配置日志记录,c#,logging,uwp,log4net,log4net-configuration,C#,Logging,Uwp,Log4net,Log4net Configuration,我有一个UWP应用程序,它使用了我的一些库。 这样的库使用log4net进行日志记录,并在多个项目中共享,而不仅仅是UWP 我想通过XML配置文件中通常的confi部分来配置log4net,但是我在UWP项目中找不到这样做的方法,因为没有app.config文件 我应该把下面的部分放在哪里 <log4net> <appender name="Console" type="log4net.Appender.ConsoleAppender"> <

我有一个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

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

Log4net
的类可以通过其
Configure
重载将这些设置作为
FileInfo
xmlement
接受

log4net.Config.XmlConfigurator.Configure(XmlElement config);
log4net.Config.XmlConfigurator.Configure(Stream config);
log4net.Config.XmlConfigurator.Configure(FileInfo config);
要完成pfx回答,如果您使用的是netStandard,则必须使用带有附加参数的
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();
        }
    }
}
名称空间AppWithLog4net
{
公共类LocalStorageFileAppender:log4net.Appender.TextWriterAppender
{
私有流m_流;
公共LocalStorageFileAppender():base(){}
受保护的重写void PrepareWriter()
{
IAsyncOperation 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=newlog4net.Util.QuietTextWriter(newstreamwriter(m_stream,Encoding.UTF8),ErrorHandler);
WriteHeader();
}
受保护的覆盖无效重置()
{
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
。可能是
ApplicationData.LocalCacheFolder
TemporaryFolder
?你好,米克德,谢谢你的评论。我已经更新了响应,因为我也认为默认情况下不应将其上载到云。Log4Net是否支持自定义Log4Net.config文件?@DavidPrice,但您必须让Log4Net知道在哪里可以找到此文件-一种方法是通过
app.config
文件中的设置。因为这个问题是关于UWP应用程序的,所以这是不可能的,因为UWP没有
app.config
文件的概念。我的回答显示了如何通过代码引用这样一个自定义配置文件。