Этого можно достичь с помощью пользовательского преобразователя типов (через IConvertFrom
).
Вы можете повторно использовать реализацию Log4net's PatternString
для анализа контекстаproperties (здесь: %property{RemoteAddress}
).
Преобразователь типов выглядит следующим образом, анализируя и преобразовывая сконфигурированное значение в IPAddress
.
public class IPAddressPatternConverter : IConvertFrom
{
public IPAddressPatternConverter()
{}
public Boolean CanConvertFrom(Type sourceType)
{
return typeof(String) == sourceType;
}
public Object ConvertFrom(Object source)
{
String pattern = (String)source;
PatternString patternString = new PatternString(pattern);
String value = patternString.Format();
return IPAddress.Parse(value);
}
}
В начале вашего приложениявы регистрируете его в ConverterRegistry
Log4net через
log4net.Util.TypeConverters.ConverterRegistry.AddConverter(typeof(IPAddress), new IPAddressPatternConverter());
Конфигурация xml остается неизменной:
(обратите внимание на указание% правильного t y вместо% Propery.)
<appender name="UdpAppender" type="log4net.Appender.UdpAppender">
<RemoteAddress value="%property{RemoteAddress}" />
<!-- Remaining settings. --->
</appender
Фактический IP-адрес настраивается с помощью свойства context.
String ipAddress = "127.0.0.1";
log4net.GlobalContext.Properties["RemoteAddress"] = ipAddress;