I would like to add a RemoteSyslogAppender
like this :
<appender name="RemoteSyslogAppenderApi" type="log4net.Appender.RemoteSyslogAppender">
<identity value="MC_BACK" />
<layout type="log4net.Layout.PatternLayout" value="%-5p %type: %m%n"/>
<remoteAddress value="%property{RemoteAddress}" />
</appender>
Property RemoteAddress
is set from appsettings.json
and loaded in Program.cs
like this :
log4net.Util.TypeConverters.ConverterRegistry.AddConverter(typeof(IPAddress), new IPAddressPatternConverter());
log4net.GlobalContext.Properties["RemoteAddress"] = appTypeOptions.SyslogAddress;
If the remote address is null, log4net is throw a warning :
log4net:WARN Unable to set property [remoteAddress] on object [log4net.Appender.RemoteSyslogAppender] using value [%property{RemoteAddress}] (with acceptable conversion types)
Is there any mean to conditionally enable/disable appender directly in the configuration file?
Thank you for your help
I don't believe we can conditionally disable an appender from the config file (happy to be proven wrong). That said, we can try to do it in code.
First of all, if we just don't want the warning to come up, the simplest solution is to not return null
in the converter.
public class IPAddressPatternConverter : log4net.Util.TypeConverters.IConvertFrom
{
public bool CanConvertFrom(Type sourceType) => true;
public object ConvertFrom(object source)
=> IPAddress.TryParse(source?.ToString(), out var result)
? result
: IPAddress.None; // Always return an IPAddress, not null.
}
IPAddress.None
is 255.255.255.255
which is usually a broadcast IP. But RemoteSyslogAppender
uses multicast, which has special addresses for "broadcasting", e.g. 224.0.0.1
or .2
.
For our purpose, the above converter should stop the WARNING that was thrown. We could move on.
BUT, since the appender is still active, it will still need to generate and format our messages (then proceeds to send them.. nowhere). It's most likely fine, but if we're logging intensively and our messages are quite expensive to construct, we're wasting precious resources.
To disable it, we just have to find it and set the Threshold
to Off
.
foreach (var appender in
log4net.LogManager.GetRepository().GetAppenders()
.OfType<log4net.Appender.RemoteSyslogAppender>()
.Where(a => a.RemoteAddress == IPAddress.None))
{
appender.Threshold = log4net.Core.Level.Off;
appender.ActivateOptions();
}