Файл конфигурации log4net для net.core с UDP Добавляет удаленный адрес динамически - PullRequest
0 голосов
/ 15 октября 2018

Я получил файл log4net, в который я добавил следующее: я хочу иметь возможность вставлять переменную RemoteAddress из моего файла appSetting.json через страницу startup.cs.Но я получаю следующую ошибку:

log4net: ОШИБКА Не удалось создать Appender [UdpAppender] типа [log4net.Appender.UdpAppender].Сообщаемая ошибка следует.log4net.Util.TypeConverters.ConversionNotSupportedException: невозможно преобразовать значение типа [System.String] [% Propery {RemoteAddress}] в тип [System.Net.IPAddress] ---> System.Net.Sockets.SocketException: такого хоста нетизвестен в System.Net.Dns.InternalGetHostByName (строка hostName, логическое значение includeIPv6) в System.Net.Dns.ResolveCallback (контекст объекта)

Код в файле log4net -

<appender name="UdpAppender" type="log4net.Appender.UdpAppender">
        <RemoteAddress value="%propery{RemoteAddress}" />
        <RemotePort value="5005" />
        <encoding value="utf-8"/>
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level - %property{log4net:HostName} - %message%newline" />
        </layout>
    </appender>

Я добавил в файл запуска следующий код -

//logging
XmlDocument log4NetConfig = new XmlDocument();
log4NetConfig.Load(File.OpenRead("log4net.config"));
var repo = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
log4net.GlobalContext.Properties["LogFileName"] = env.ContentRootPath + Configuration["AppSettings:Logging:LoggerPath"];
log4net.GlobalContext.Properties["RemoteAddress"] = System.Net.IPAddress.Parse(Configuration["AppSettings:Logging:RemoteAddress"]);
log4net.Config.XmlConfigurator.Configure(repo, log4NetConfig["log4net"]);

log4net.LogManager.GetLogger(typeof(Startup)).Info($"Invoice service started. environment={env.EnvironmentName}");

Разве невозможно динамически добавить удаленный адрес?Когда я использую фактический IP-адрес в файле log4net вместо "%propery{RemoteAddress}" и log4net.GlobalContext.Properties["RemoteAddress"] = System.Net.IPAddress.Parse(Configuration["AppSettings:Logging:RemoteAddress"]);, он работает.

1 Ответ

0 голосов
/ 15 октября 2018

Этого можно достичь с помощью пользовательского преобразователя типов (через 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...