Wie bereits gesagt, gibt es keine eingebauten Platzhalter für den assembly und ein paar Möglichkeiten, um es irgendwie zu erreichen. Eine weitere Möglichkeit besteht darin, einen eigenen Handler/Konverter mit dem Log4Net-Framework zu registrieren.
Grundsätzlich tun Sie das gleiche, das die log4net.Util.PatternString Klasse intern tut (und Sie könnten den relevanten Quellcode für ein vollständigeres "Beispiel" als die unten angegebenen Fragmente überprüfen).
Beispiel:
<file value="[ASSEMBLYNAME].log" type="MyExpressionHandler, MyAssembly"/>
Dann wird der Code:
Code eingeben hier
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 ... */);
}
}
dann eine passende "Converter Class" bieten.
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);
}
}
Und schließlich Ihr Wandler an den Log4Net Rahmen bekannt machen:
ConverterRegistry.AddConverter(typeof(MyExpression), typeof(MyExpressionConverter));
NLog eine Variable ähnlich zu dem, was ich will: '$ {Prozessname}' –