2009-01-22 98 views
35

我希望log4net将日志文件(使用RollingFileAppender)写入公共应用程序数据文件夹的子文件夹(例如C:\ Documents and Settings \ All Users \ Application Data \ Company \ Product \ Logs)。
但是,在Win XP上,没有指定此文件夹的环境变量。我们有%ALLUSERSPROFILE%,我们有%APPDATA%,但没有什么像%ALLUSERSAPPDATA%
编程方式,我可以使用Environment.SpecialFolder.CommonApplicationData,但我需要把它的log4net的配置,这样的事情:如何为log4net指定通用应用程序数据文件夹?

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

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

+0

请更正问题标题拼写“特定” – 2011-01-11 18:43:58

+0

根据@ codeulike的答案中的链接,从1.2开始。11,你可以简单地使用PatternString表达式,如[`%envFolderPath {CommonApplicationData}`](http://stackoverflow.com/questions/1535736/log4net-how-can-i-change-the-file-location-programmatically- C/1535998#1535998)。 – Ashe 2014-08-08 04:55:14

回答

12

This posting在log4net邮件列表中解释了如何定义自己的路径替换变量。

+0

谢谢,这给了我正确的想法。我将定义一个属性并在配置文件中使用PatternString作为文件夹。 – user57474 2009-01-22 13:51:41

+0

链接已死... – Matt 2013-06-25 16:45:05

+0

您可以使用来自这里接受的答案的解决方案http://stackoverflow.com/questions/1535736/how-can-i-change-the-file-location-programmatically/1535998#1535998。此解决方案正在使用Win Xp和所有下列系统 – user2126375 2014-04-14 19:20:37

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> 
11

下面是来自log4net的邮件列表中的全部代码pilif链接:

基本方法是实施用于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 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所述。

2

完整的工作解决方案 - 我的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> 
0

写自己的模式转换器现在(2018年二月)按log4net的版本2.0.8.0。

您可以使用没有任何转换器来获取环境变量,如下所示。

<file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\mylogfile.txt" /> 

请参阅:log4net.Util.PatternString class documentation for more details。

相关问题