log4net从自定义appender访问上下文属性



我正在使用log4net与自定义的appender一起记录到Azure存储表,并且正在从我的Appender中访问log4net.GlobalContext属性的问题。我正在从Azure函数内登录。

附加非常简单,简单,效果很好,但是我想添加一些自定义属性 - 其中一个是一个invacationId,只能从Azure函数中访问,因此我想知道最好的方法实现这一目标。

知道我缺少什么吗?

appender

protected override void Append(LoggingEvent loggingEvent)
{
  _tableCtx.Log(new LogEntry
                {
                  Timestamp = loggingEvent.TimeStamp,
                  Message = loggingEvent.RenderedMessage,
                  Level = loggingEvent.Level.Name,
                  // properties is always empty
                  InvocationId = loggingEvent.Properties["InvocationId"],
                  PartitionKey = loggingEvent.LoggerName,
                 });
}

azure函数

public static async Task<HttpResponseMessage> MyFunction([HttpTrigger(AuthorizationLevel.Function, "post")]HttpRequestMessage req, ILogger log, ExecutionContext context)
{
  log4net.GlobalContext.Properties["InvocationId"] = context.InvocationId;
  using (var config = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyFunc.logging.config"))
  {
      log4net.Config.XmlConfigurator.Configure(config);
  }
   var log = LogManager.GetLogger(context.FunctionName);
}

尝试

loggingEvent.GetProperties()["InvocationId"]

loggingEvent.LookupProperty("InvocationId")

有关更多详细信息,请参见此处

您必须在初始化log4net之后设置属性:

  using (var config = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyFunc.logging.config"))
  {
      log4net.Config.XmlConfigurator.Configure(config);
  }
  var log = LogManager.GetLogger(context.FunctionName);
  log4net.GlobalContext.Properties["InvocationId"] = context.InvocationId;

尚未初始化时,您也只需要初始化log4net。在每个呼叫上进行操作不是很有效。

我最终这样做,这比我想象的要简单。

log4net.LogicalThreadContext.Properties["InvocationId"].ToString()

最新更新