我希望log4net将日志文件(使用RollingFileAppender)写入公共应用程序数据文件夹的子文件夹(例如C:\ Documents and Settings \ All Users \ Application Data \ Company \ Product \ Logs)。
但是,在Win XP上,没有指定此文件夹的环境变量。我们有%ALLUSERSPROFILE%
,我们有%APPDATA%
,但没有像%ALLUSERSAPPDATA%
这样的内容
以编程方式,我可以使用Environment.SpecialFolder.CommonApplicationData
,但我需要将它放在log4net配置中,如下所示:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="%ALLUSERSAPPDATA%\Company\Product\Logs\error.log" />
</appender>
好的,我们可以在我们的设置中定义这个,但也许有人提出了更好的想法?
答案 0 :(得分:33)
我们只是用这个:
<param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>
效果很好。
<小时/> 这行可以简单地插入到当前的appender配置中:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>
</appender>
答案 1 :(得分:12)
This posting解释了如何定义自己的路径替换变量。
答案 2 :(得分:12)
以下是pilif链接到的log4net邮件列表中的完整代码:
基本上,该方法是为log4net配置文件实现自定义模式转换器。
首先将此类添加到您的项目中:
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
的转换器,它将其指向SpecialFolderPatternConverter类。然后它调用该类的Convert
,传入CommonApplicationData(或其他)枚举值。
显然,在log4net(1.2.11)的下一个版本中,将有一个更简单的方法,如here所述。
答案 3 :(得分:3)
完整且有效的解决方案 - 我的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>
答案 4 :(得分:1)
在当前的log4net版本(2.0.8.0)中,您可以简单地使用
<file value="${ProgramData}\myFolder\LogFiles\" />
代表C:\ProgramData
${LocalAppData}
for C:\Users\user\AppData\Local\
和${AppData}
代表C:\Users\user\AppData\Roaming\
答案 5 :(得分:0)
现在(2018年FEB)根据log4net版本2.0.8.0。
您可以在没有任何转换器的情况下使用环境变量,如下所示。
<file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\mylogfile.txt" />
请参阅:log4net.Util.PatternString课程文档以获取更多详细信息。