log4net 从自定义 appender 访问上下文属性
log4net accessing context properties from custom appender
我将 log4net 与记录到 Azure 存储表的自定义附加程序一起使用,并且在从我的附加程序中访问 log4net.GlobalContext
属性时遇到问题。我正在从 Azure 函数内部登录。
附加非常直接简单并且工作正常,但我想添加几个自定义属性 - 其中一个是 InvocationId 并且只能从 Azure Functions 访问,所以我想知道最好的实现这一目标的方法。
知道我错过了什么吗?
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")
有关详细信息,请参阅 here
初始化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()
我将 log4net 与记录到 Azure 存储表的自定义附加程序一起使用,并且在从我的附加程序中访问 log4net.GlobalContext
属性时遇到问题。我正在从 Azure 函数内部登录。
附加非常直接简单并且工作正常,但我想添加几个自定义属性 - 其中一个是 InvocationId 并且只能从 Azure Functions 访问,所以我想知道最好的实现这一目标的方法。
知道我错过了什么吗?
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")
有关详细信息,请参阅 here
初始化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()