log4net logz.io appender 配置文件将参数传递给 listenerUrl 和 token 标签

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

要在多个环境中将项目设置为 运行 并使用 logz.io,我需要根据构建定义设置不同的令牌和 listenerUrl 值。项目设置了 log4net.config 个文件,想法是使用 log4net globalcontext 属性来传递值,就像我为布局模式标记所做的那样。不幸的是,log4net 保留了这些 属性 名称(占位符)并且不会用来自 globalcontext 的值替换它们。

我的问题是如何动态设置这些标签?

我试过的东西是:

  1. 配置中的属性。
  2. 以编程方式获取根附加程序和设置值: var rootAppender = LogManager.GetRepository(Assembly.GetEntryAssembly()).GetAppenders().OfType<LogzioAppender>();
  3. 正在创建新的 Appender 对象并将其添加到 hierarchy.Root.AddAppender(logzioAppender);

配置看起来很像 logz.io 文档中的默认配置。

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

出于某种原因,我尝试过的选项 2 在第一次尝试时不起作用。 此代码完成工作并覆盖 log4net 配置文件:

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