有没有办法添加发出日志记录事件的程序集的程序集版本?
答案 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>