C# 如何在UWP应用程序中通过log4net配置日志记录
我有一个UWP应用程序,它使用了我的一些库。 这样的库使用log4net进行日志记录,并在多个项目中共享,而不仅仅是UWP 我想通过XML配置文件中通常的confi部分来配置log4net,但是我在UWP项目中找不到这样做的方法,因为没有app.config文件 我应该把下面的部分放在哪里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"> <
<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
文件的概念。我的回答显示了如何通过代码引用这样一个自定义配置文件。