日志程序集版本,其中包含使用log4net记录的代码?

时间:2011-09-13 12:19:30

标签: log4net

有没有办法添加发出日志记录事件的程序集的程序集版本?

2 个答案:

答案 0 :(得分:2)

我认为没有任何内置可以做到这一点,所以你可能需要创建自己的自定义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()。版本,如果该帐户具有非常本地的权限,则会抛出SecurityException。

答案 1 :(得分:1)

检查一下:记录事件上下文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>