Odpowiedź Piotra prawie pracował dla mnie; zdecydowanie postawił mnie na właściwej drodze, ponieważ potrzebowałem podobnego rozwiązania.Co miałem zrobić, to podklasa PatternConverter
:
public class ConfigurationSettingsConverter : PatternConverter
{
protected override void Convert(TextWriter writer, object state)
{
// use Option as a key to get a configuration value...
if (Option != null)
writer.Write(ConfigUtils.Setting[Option]);
}
}
i dodać tego konwertera w ActivateOptions
ręcznym podklasy PatternString
:
public class ConfigurationSettingsPatternString : PatternString
{
public ConfigurationSettingsPatternString()
{}
public ConfigurationSettingsPatternString(string pattern): base(pattern)
{}
public override void ActivateOptions()
{
AddConverter("cs", typeof(ConfigurationSettingsConverter));
base.ActivateOptions();
}
}
początkowo próbował to zrobić w konstruktorze jak Piotr odpowiedział: ale konwerter nie został zwrócony z podstawowego wywołania ciągu wzorca, aby przeanalizować ciąg źródłowy. Miałem też zarejestrować konwerter typu (nie należy mylić z PatternConverter
) gdziekolwiek w ścieżce kodu przed log4net została skonfigurowana:
ConverterRegistry.AddConverter(
// type we want to convert to (from string)...
typeof(ConfigurationSettingsPatternString),
// the type of the type converter that will do the conversion...
typeof(ConfigurationSettingsPatternStringConverter));
Nie robi to zapobiega log4net z możliwości przekształcenia wartość atrybutu w węźle FileAppender
'file do ConfigurationSettingsPatternString
. Na przykład, w tej konfiguracji fragmentu
<file
type="Some.Name.Space.ConfigurationSettingsPatternString, Some.Assembly"
value="some\path\MyLog.%cs{SomeKey}.log" />
%cs.{SomeKey}
nie rozszerzył się i log4net zgłasza wyjątek. Oto kod dla przetwornika typu:
public class ConfigurationSettingsPatternStringConverter : IConvertTo, IConvertFrom
{
public bool CanConvertFrom(Type sourceType)
{
return sourceType == typeof(string);
}
public bool CanConvertTo(Type targetType)
{
return typeof(string).IsAssignableFrom(targetType);
}
public object ConvertFrom(object source)
{
var pattern = source as string;
if (pattern == null)
throw ConversionNotSupportedException.Create(typeof(ConfigurationSettingsPatternString), source);
return new ConfigurationSettingsPatternString(pattern);
}
public object ConvertTo(object source, Type targetType)
{
var pattern = source as PatternString;
if (pattern == null || !CanConvertTo(targetType))
throw ConversionNotSupportedException.Create(targetType, source);
return pattern.Format();
}
}
Ten okazuje się działać dobrze dla systemu Windows wielu usług udostępnianych w ramach tego samego pliku wykonywalnego (na przykład można dodać % ServiceName wzór jak nazwa pliku w celu oddzielenia dzienniki służb
Można to uzyskać poprzez wzorzec dodatku w Log4Net w wersji 1.2.11. Zobacz stackoverflow.com/a/26277219/203371 –