2011-09-13 8 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

チェックこのアウト:ログイベントのコンテキストのプロパティではThreadContextセット開始時http://www.beefycode.com/post/Log4Net-Tutorial-pt-6-Log-Event-Context.aspx

次のものが必要です。

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(); 
        } 
    } 
} 

使用このプロパティあなたのアペンダの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> 
関連する問題