2011-01-13 48 views
0

是否有我可以用來命名我的日誌文件的變量?如何用程序集名稱命名log4net輸出文件?

<file value="${ALLUSERSPROFILE}\${AssemblyName}.log.xml" /> 

  • ${ALLUSERSPROFILE}真正起作用
  • ${AssemblyName}沒有,這是什麼我做了,只是爲了我想要的插圖。
+0

NLOG具有可變相似,我想:'$ {processname}` – 2011-01-13 18:12:12

回答

1

不是默認情況下。

此語法用於擴展Windows Environment Variables。雖然ALLUSERSPROFILE是一個標準的環境變量,但AssemblyName不是。你將不得不自己設置AssemblyName,作爲一個動態解決方案,這不是一件容易的事情。

0

NLog中的processname類似於log4net中的PatternLayout;它們都是日誌本身佈局/渲染的一部分。

如果您想要在應用程序中使用環境變量,請強制將創建作爲安裝的一部分或在代碼中創建自己的環境變量;一個C#示例是here

如果該選項不適合您的需求,那麼您可以動態設置路徑,如here所示。

0

你可以編寫自己的模式佈局轉換器。我張貼的樣本here,我認爲這是很容易修改,以便它寫入組件名稱...

0

另一種選擇是,以定義在初始化時一個全局屬性:

GlobalContext.Properties["pid"] = System.Diagnostics.Process.GetCurrentProcess().Id; 
this.logger = log4net.GetLogger("LoggerSample"); 

在你配置文件,你可以使用像這樣的「pid」屬性:

<param name="ConversionPattern" value="%d;%property{log4net:HostName};%property{pid};%t;%p;%c;%M;%L;%m%n" /> 

希望,我很清楚!

BR ++ mabra

3

正如其他人所說,有對的AssemblyName和一對夫婦的方式來實現,無論如何它沒有內置的佔位符。另一個是將您自己的處理程序/轉換器註冊到Log4Net框架。

基本上,你的做法與log4net.Util.PatternString類在內部做的一樣(你可以檢查相關的源代碼以獲得比下面給出的更多的完整「示例」)。

實施例:

<file value="[ASSEMBLYNAME].log" type="MyExpressionHandler, MyAssembly"/> 

然後代碼:

輸入代碼在這裏

using log4net.Core; 

public sealed class MyExpressionHandler : IOptionHandler 
{ 
    private string m_str; 

    public MyExpressionHandler(string str) 
    { 
     m_str = str; 
    } 

    public void ActivateOptions() 
    { 
    } 

    public string Format() 
    { 
     return m_str.Replace("[ASSEMBLYNAME]", /* ... whatever ... */); 
    } 
} 

然後提供匹配的 「轉換器類」。

internal class MyExpressionHandlerConverter : IConvertTo, IConvertFrom 
    { 
     public bool CanConvertTo(Type targetType) 
     { 
      return (typeof(string).IsAssignableFrom(targetType)); 
     } 

     public object ConvertTo(object source, Type targetType) 
     { 
      MyExpression patternString = source as MyExpression; 
      if (patternString != null && CanConvertTo(targetType)) 
      { 
       return patternString.Format(); 
      } 
      throw ConversionNotSupportedException.Create(targetType, source); 
     } 

     public bool CanConvertFrom(System.Type sourceType) 
     { 
      return (sourceType == typeof(string)); 
     } 

     public object ConvertFrom(object source) 
     { 
      string str = source as string; 
      if (str != null) 
      { 
       return new MyExpression(str); 
      } 
      throw ConversionNotSupportedException.Create(typeof(MyExpression), source); 
     } 
} 

,最終使你的轉換器已知log4net的框架:

ConverterRegistry.AddConverter(typeof(MyExpression), typeof(MyExpressionConverter)); 
相關問題