2011-09-13 11 views

回答

1

我不認爲有任何內置的,將做到這一點,所以你可能需要創建自己的自定義PatternConverter和的PatternLayout(這是很容易的)

最大的問題是速度,因爲這將需要log4net生成來電者信息和(用他們自己的話說)

警告生成來電者類信息很慢。因此,應該避免使用它,除非執行速度不是問題。


如果速度不是問題,那麼這樣的事情應該工作。

public class AssemblyVersionPatternConverter : log4net.Util.PatternConverter 
{ 
    protected override void Convert(TextWriter writer, object state) 
    { 
     var le = state as log4net.Core.LoggingEvent; 
     if (le != null) 
      writer.Write(GetAssemblyVersion(le.LocationInformation.ClassName)); 
    } 
} 

public class AssemblyVersionPatternLayout : log4net.Layout.PatternLayout 
{ 
    public AssemblyVersionPatternLayout() 
    { 
     AddConverter(new ConverterInfo 
      { 
      Name = "AssemblyVersion", 
      Type = typeof(AssemblyVersionPatternConverter) 
      }); 
    } 
} 

除了寫GetAssemblyVersion方法,即所有需要實現自己的客戶PatternConverter和的PatternLayout。

然後您必須更改您的log4net配置文件,告訴它使用您的自定義例程。

例如,如果您有類似

<layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%5level %message%newline" /> 
</layout> 

將其更改爲類似

<layout type="MyNameSpace.AssemblyVersionPatternLayout, MyDllname"> 
    <conversionPattern value="%5level %AssemblyVersion %message%newline" /> 
</layout> 



的GetAssemblyVersion方法,可能是類似以下

private string GetAssemblyVersion(string className) 
{ 
    Type type = Type.GetType(className); 
    System.Reflection.Assembly assembly ; 
    if (type != null) 
     assembly = type.Assembly ; 
    else 
     assembly = AppDomain.CurrentDomain.GetAssemblies() 
      .FirstOrDefault(a => a.GetType(className) != null); 

    if (assembly == null) 
     return String.Empty; 

    return assembly.FullName.Split(',')[1].Replace("Version=", ""); 
} 

請注意,不建議使用assembly.GetName()。Version,因爲如果帳戶具有非常本地的權限,則可能會引發SecurityException。

0

檢查了這一點:登錄事件上下文http://www.beefycode.com/post/Log4Net-Tutorial-pt-6-Log-Event-Context.aspx

在啓動設置ThreadContext與性能,你需要:

class Program 
{ 
    private static log4net.ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
  
    static void Main(string[] args) 
    { 
            log4net.Config.XmlConfigurator.Configure(); 
            log4net.ThreadContext.Properties["myContext"] = "Logging from Main"; 
            log4net.ThreadContext.Properties["AssemblyVersion"] = GetType().Assembly.GetName().Version; 
            Log.Info("this is an info message"); 
            Console.ReadLine(); 
        } 
    } 
} 

使用此屬性在您的appender conversionPattern:

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%logger (%property{myContext}) (%property{AssemblyVersion}) [%level]- %message%newline" /> 
     </layout> 
</appender>