首页 > 解决方案 > 带有 UDP 的 net.core 的 log4net 配置文件动态附加远程端口

问题描述

我有一个 log4net.config 文件,我希望能够通过 Program.cs 文件动态注入 RemotePort 变量。但我收到以下错误:

System.FormatException: Input string was not in a correct format.

我能够使用此策略动态传递 RemoteAddress :

带有 UDP 的 net.core 的 log4net 配置文件动态附加远程地址

log4net 文件中的代码

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

Program.cs 中的代码

log4net.GlobalContext.Properties["RemotePort"] = 514;

标签: c#log4netremote-server

解决方案


参考文章中显示的相同概念也适用于此。

您需要从 a 转换为 a PatternStringInt32这需要自定义类型转换器实现IConvertFrom.

重用 a 的实现PatternString%property{RemotePort}被 via 传入的值替换log4net.GlobalContext.Properties["RemotePort"] = 514,这将导致514.

public class NumericConverter : IConvertFrom
{
    public NumericConverter()
    {}

    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 Int32.Parse(value);
    }
}

在启动时注册此类型转换器,如下所示

log4net.Util.TypeConverters.ConverterRegistry.AddConverter(typeof(int), new NumericConverter());

推荐阅读