net.core 的 log4net 配置文件,UDP 动态附加远程地址
log4net config file for net.core with UDP Append remote address dynamically
我得到了一个 log4net 文件,我在其中添加了以下内容:
我希望能够通过 startup.cs 页面从我的 appSetting.json 文件中注入 RemoteAddress 变量。
但我收到以下错误:
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 文件中的代码 -
<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}");
不能动态添加远程地址吗?当我在 log4net 文件中使用实际 IP 地址而不是使用 "%propery{RemoteAddress}"
和 log4net.GlobalContext.Properties["RemoteAddress"] = System.Net.IPAddress.Parse(Configuration["AppSettings:Logging:RemoteAddress"]);
它正在工作。
这可以通过自定义类型转换器(通过 IConvertFrom
)实现。
您可以重用 Log4net 的 PatternString
的实现来解析上下文属性(此处:%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);
}
}
在您的应用程序开始时,您通过
向 Log4net 的 ConverterRegistry
注册它
log4net.Util.TypeConverters.ConverterRegistry.AddConverter(typeof(IPAddress), new IPAddressPatternConverter());
xml 配置保持原样:
(注意指定 %property 而不是 %属性。)
<appender name="UdpAppender" type="log4net.Appender.UdpAppender">
<RemoteAddress value="%property{RemoteAddress}" />
<!-- Remaining settings. --->
</appender
您通过涉及的上下文属性配置实际IP地址。
String ipAddress = "127.0.0.1";
log4net.GlobalContext.Properties["RemoteAddress"] = ipAddress;
我得到了一个 log4net 文件,我在其中添加了以下内容: 我希望能够通过 startup.cs 页面从我的 appSetting.json 文件中注入 RemoteAddress 变量。 但我收到以下错误:
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 文件中的代码 -
<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}");
不能动态添加远程地址吗?当我在 log4net 文件中使用实际 IP 地址而不是使用 "%propery{RemoteAddress}"
和 log4net.GlobalContext.Properties["RemoteAddress"] = System.Net.IPAddress.Parse(Configuration["AppSettings:Logging:RemoteAddress"]);
它正在工作。
这可以通过自定义类型转换器(通过 IConvertFrom
)实现。
您可以重用 Log4net 的 PatternString
的实现来解析上下文属性(此处:%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);
}
}
在您的应用程序开始时,您通过
向 Log4net 的ConverterRegistry
注册它
log4net.Util.TypeConverters.ConverterRegistry.AddConverter(typeof(IPAddress), new IPAddressPatternConverter());
xml 配置保持原样:
(注意指定 %property 而不是 %属性。)
<appender name="UdpAppender" type="log4net.Appender.UdpAppender">
<RemoteAddress value="%property{RemoteAddress}" />
<!-- Remaining settings. --->
</appender
您通过涉及的上下文属性配置实际IP地址。
String ipAddress = "127.0.0.1";
log4net.GlobalContext.Properties["RemoteAddress"] = ipAddress;