Search code examples
c#.net-corelog4netlogz.io

log4net logz.io appender config file pass parameter to listenerUrl and token tags


To setup project to run on multiple environments and use logz.io I need to set different token and listenerUrl values depending of the build definition. Project has log4net.config files set, and idea was to use log4net globalcontext properties to pass values just like what I do for layout pattern tag. Unfortunately log4net keeps these property names (placeholders) and does not replace them with values from globalcontext.

My question is how to set these tags dynamically?

Stuff that I've tried are:

  1. properties in config.
  2. Geting root appender and setting values programaticaly: var rootAppender = LogManager.GetRepository(Assembly.GetEntryAssembly()).GetAppenders().OfType<LogzioAppender>();
  3. Creating new Appender object and adding it to hierarchy.Root.AddAppender(logzioAppender);

Configuration looks pretty much default like from logz.io docs.

<log4net>
  <appender name="LogzioAppender" type="Logzio.DotNet.Log4net.LogzioAppender, Logzio.DotNet.Log4net">
    <token value="%p{token}" />
    <type>log4net</type>
    <listenerUrl value="%p{listenerhost}:8071" />
    <bufferSize>100</bufferSize>
    <bufferTimeout>00:00:05</bufferTimeout>
    <retriesMaxAttempts>3</retriesMaxAttempts>
    <retriesInterval>00:00:02</retriesInterval>
    <debug>false</debug>

  </appender>

  <root>
    <level value="INFO" />
    <appender-ref ref="LogzioAppender" />
  </root>
</log4net>

Solution

  • For some reason option number 2 that I've tried did not work on first attempt. This code gets the job done and overrides log4net config file:

    var logzioAppender = LogManager.GetRepository(Assembly.GetEntryAssembly()).GetAppenders().OfType<LogzioAppender>();
    logzioAppender.FirstOrDefault().AddListenerUrl("https://listener_url:8071");
    logzioAppender.FirstOrDefault().AddToken("key_value");