0

我在这里遗漏了一些东西,因为大量文章表明它应该可以工作。该计划将创建一个自定义记录器实现,以便我可以以结构化的方式存储各种值。

但是,目前这些基础似乎不起作用。

我正在尝试使用范围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}");
        }

    }
}

我错过了什么?!

谢谢。

4

1 回答 1

1

据我所知,当使用dictionary type内部logger.BeginScope方法时,key-value pair集合中的 将被添加到应用程序洞察遥测中custom properties(doc is here)。它不会取代{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());
        }
于 2021-03-03T08:18:56.147 回答