如何为log4net指定通用的应用程序数据文件夹?

我希望log4net将日志文件(使用RollingFileAppender)写入常用应用程序数据文件夹的子文件夹(例如C:\ Documents and Settings \ All Users \ Application Data \ Company \ Product \ Logs)。
但是,在Win XP上,没有指定此文件夹的环境variables。 我们有%ALLUSERSPROFILE% ,我们有%APPDATA% ,但没有像%ALLUSERSAPPDATA%
以编程方式,我可以使用Environment.SpecialFolder.CommonApplicationData ,但我需要把它放在log4netconfiguration,如下所示:

 <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="%ALLUSERSAPPDATA%\Company\Product\Logs\error.log" /> </appender> 

好的,我们可以在我们的设置中定义这个,但也许有人提出一个更好的主意?

这个在log4net邮件列表上的post解释了如何定义自己的pathreplacevariables。

我们只是用这个:

 <param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/> 

它工作很好。


这一行可以简单地插入到你当前的appenderconfiguration中:

 <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/> </appender> 

以下是来自log4net邮件列表的完整代码, pilif链接到:

基本上这个方法是为log4netconfiguration文件实现一个自定义模式转换器。

首先将这个类添加到你的项目中:

 public class SpecialFolderPatternConverter : log4net.Util.PatternConverter { override protected void Convert(System.IO.TextWriter writer, object state) { Environment.SpecialFolder specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), base.Option, true); writer.Write(Environment.GetFolderPath(specialFolder)); } } 

然后如下设置FileAppender的File参数:

 <file type="log4net.Util.PatternString"> <converter> <name value="folder" /> <type value="MyAppName.SpecialFolderPatternConverter,MyAppName" /> </converter> <conversionPattern value="%folder{CommonApplicationData}\\SomeOtherFolder\\log.txt" /> </file> 

基本上%folder告诉它看看转换器称为folder ,它指向Sp​​ecialFolderPatternConverter类。 然后它调用该类上的Convert ,传入CommonApplicationData(或其他)枚举值。

显然,在log4net(1.2.11)的下一个版本中,将会有一个更简单的方法,如下所述。

完整的工作解决scheme – 我的Log4net.config文件的内容。 在Log4Net的实际版本中,不再需要编写自己的模式转换器

 <?xml version="1.0"?> <log4net> <root> <level value="INFO" /> <appender-ref ref="LogFileAppender" /> </root> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > <file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\MyProject\\Logs\\log.txt" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="100MB" /> <layout type="log4net.Layout.PatternLayout"> <ConversionPattern type="log4net.Util.PatternString" value="%%-5p %%d{yyyy-MM-dd HH:mm:ss} - %%m%%n" /> </layout> </appender> </log4net>