Azure functions 自定义ILogger范围值未按预期工作

Azure functions 自定义ILogger范围值未按预期工作,azure-functions,ilogger,Azure Functions,Ilogger,我在这里遗漏了一些东西,因为许多文章都建议它应该有效。该计划将创建一个自定义记录器实现,以便我可以以结构化方式存储各种值 然而,就目前而言,基本原则似乎不起作用 我正在尝试使用ILogger中的作用域来设置某些值,例如transactionId 我正在使用Azure函数。在初创公司中,我添加了 public override void Configure(IFunctionsHostBuilder builder) { builder.Services.A

我在这里遗漏了一些东西,因为许多文章都建议它应该有效。该计划将创建一个自定义记录器实现,以便我可以以结构化方式存储各种值

然而,就目前而言,基本原则似乎不起作用

我正在尝试使用
ILogger
中的作用域来设置某些值,例如
transactionId

我正在使用Azure函数。在初创公司中,我添加了

public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddLogging();
这很好用。在函数中,我正在尝试这个

public class Test_Http
{
    private readonly ILogger logger;

    public Test_Http(ILogger<TestHttp> log)
    {
        this.logger = log;
    }


    [FunctionName("TestHttp")]
    public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        // This works fine, SomeId is replace.
        // When using a custom logger I can see 2 values in the state.
        logger.LogInformation("Message '{SomeId}'", "TheID");


        using (logger.BeginScope(new Dictionary<string, object>
        {
            ["SomeId"] = "SOME ID"
        }))
        {
            // SomeId is not replaced as I would expect.
            // State in a custom logger contains a single value.
            logger.LogInformation("A log from within scope {SomeId}");
        }

    }
}
公共类测试\u Http
{
专用只读ILogger记录器;
公共测试\u Http(ILogger日志)
{
this.logger=log;
}
[函数名(“TestHttp”)]
公共异步任务运行(
[HttpTrigger(AuthorizationLevel.Anonymous,“get”,“post”,Route=null)]HttpRequest请求,
ILogger日志)
{
//这很好用,有人要替换。
//使用自定义记录器时,我可以在状态中看到2个值。
logger.LogInformation(“消息{SomeId}'”,“TheID”);
使用(logger.BeginScope)(新字典
{
[“SomeId”]=“SomeId”
}))
{
//SomeId并没有像我预期的那样被替换。
//自定义记录器中的状态包含单个值。
logger.LogInformation(“范围{SomeId}内的日志”);
}
}
}
我错过了什么


谢谢。

据我所知,在
logger.BeginScope
方法中使用
字典类型时,集合中的
键值对将作为
自定义属性添加到application insights遥测中(doc是)。它不会替换示例中的
{SomeId}

如果要替换它,需要在
logger.LogInformation
方法中显式添加一个值。例如:

        Dictionary<string, object> a = new Dictionary<string, object>
        {
            //SomeId only adds as a custom property for telemetry data.
            ["SomeId"] = "SOME ID"
        };

        using (logger.BeginScope(a))
        {
            //you need to explicitly add a value to replace {SomeId}
            logger.LogInformation("A log from within scope {SomeId}",a.Values.First());
        }
字典a=新字典
{
//SomeId仅添加为遥测数据的自定义属性。
[“SomeId”]=“SomeId”
};
使用(logger.BeginScope(a))
{
//您需要显式地添加一个值来替换{SomeId}
logger.LogInformation(“作用域{SomeId}内的日志”,A.Values.First());
}

哪个文档提到了它?据我所知,在使用logger.BeginScope()时,它只向信息消息添加属性。除非在logger.LogInformation方法中指定属性,如logger.LogInformation(“作用域{SomeId}内的日志”,“值”)。好的,谢谢。我没有在任何地方读过它,但(至少对我来说)它似乎是隐含的。另外,Serilog就是这样工作的,所以这可能影响了我的假设!