带有UDP的net.core的log4net配置文件动态附加远程地址 [英] log4net config file for net.core with UDP Append remote address dynamically

查看:328
本文介绍了带有UDP的net.core的log4net配置文件动态附加远程地址的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到了一个log4net文件,其中添加了以下内容: 我希望能够通过startup.cs页面从我的appSetting.json文件中注入RemoteAddress变量. 但是我收到以下错误:

I got a log4net file in which I added the following : I want to be able to inject the RemoteAddress variable from my appSetting.json file via the startup.cs page. But I am getting the following error :

log4net:ERROR无法创建类型为[log4net.Appender.UdpAppender]的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:ERROR Could not create Appender [UdpAppender] of type [log4net.Appender.UdpAppender]. Reported error follows. log4net.Util.TypeConverters.ConversionNotSupportedException: Cannot convert from type [System.String] value [%propery{RemoteAddress}] to type [System.Net.IPAddress] ---> System.Net.Sockets.SocketException: No such host is known at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6) at System.Net.Dns.ResolveCallback(Object context)

log4net文件中的代码-

The code in the log4net file -

<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>

我在启动文件中添加了以下代码-

I added in the startup file the following code -

//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}");

是否可以动态添加远程地址?当我在log4net文件中使用实际IP地址而不是使用"%propery{RemoteAddress}"log4net.GlobalContext.Properties["RemoteAddress"] = System.Net.IPAddress.Parse(Configuration["AppSettings:Logging:RemoteAddress"]);时,它将正常工作.

Is it not possible to add the remote Address dynamically? When I use the actual IP address in the log4net file instead of using "%propery{RemoteAddress}" and log4net.GlobalContext.Properties["RemoteAddress"] = System.Net.IPAddress.Parse(Configuration["AppSettings:Logging:RemoteAddress"]); it is working.

推荐答案

这可以通过自定义类型转换器来实现(通过 PatternString 的实现重复使用.解析上下文属性(此处为%property{RemoteAddress}).

This can be achieved via a custom type converter (via IConvertFrom).
You can reuse the implementation of Log4net's PatternString for the parsing of the context properties (here: %property{RemoteAddress}).

类型转换器如下所示,将配置的值解析并将其转换为IPAddress.

The type converter looks like here below, parsing and converting the configured value to an 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);
    }
}

在应用程序开始时,您可以通过

At the start of your application you register it with Log4net's ConverterRegistry via

log4net.Util.TypeConverters.ConverterRegistry.AddConverter(typeof(IPAddress), new IPAddressPatternConverter());

xml配置保持不变:
(注意,请指定%proper t y而不是%propery.)

The xml configuration stays as-is:
(Notice to specify %property instead of %propery.)

<appender name="UdpAppender" type="log4net.Appender.UdpAppender">
    <RemoteAddress  value="%property{RemoteAddress}" />
    <!-- Remaining settings. --->
</appender

您可以通过所涉及的上下文属性来配置实际IP地址.

You configure the actual IP address via the context property involved.

String ipAddress = "127.0.0.1";
log4net.GlobalContext.Properties["RemoteAddress"] = ipAddress;

这篇关于带有UDP的net.core的log4net配置文件动态附加远程地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆