2009-01-22 97 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。

相關問題