Azure Functions 中的结构化日志记录

如何解决Azure Functions 中的结构化日志记录

我正在尝试在 Azure 函数中使用结构化日志记录,但它在我这边不起作用。

我写了一个这样的简单应用

[FunctionName("Dummy")]
public IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous)]HttpRequest request,ILogger log)
{
    var instance = new User
    {
        Name1 = "foo",Name2 = "bar"
    };
    log.Loginformation("Test1: {$Test}",instance);
    log.Loginformation("Test2: {@Name}",instance);
    log.Loginformation("Test3: {@Name}",new { Name1 = "abc",Name2 = "def" });
    log.Loginformation("Test4: {Vorname} {Nachname}",instance.Name1,instance.Name2);
    return new OkResult();
}

public class User
{
    public string Name1 { get; set; }
    public string Name2 { get; set; }
}

输出如下所示:

Test1: Company.FunctionApp1.Function+User
Test2: Company.FunctionApp1.Function+User
Test3: { Name1 = abc,Name2 = def }
Test4: foo bar

我不知道为什么解构对动态类型起作用,但对定义的类不起作用。我找到了许多没有对象解构的正常日志记录示例,但我认为它应该是开箱即用的。

我错过了什么吗?

解决方法

测试 3 打印为 { Name1 = abc,Name2 = def },因为定义的类型是匿名对象,编译器为其生成 ToString() 方法以返回具有属性和值映射的字符串。

查看 this 讨论。

您可以通过反编译来验证相同的内容。

因为 Test2 和 Test1 使用对象并且没有覆盖 ToString() 定义,这就是返回 TypeName 的原因。

正确的方法是使用 Test4,以便将 VornameNachname 记录为自定义属性并可用于过滤。

,

user1672994 的回答是正确的,您可以执行以下操作:

using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace FunctionApp96
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous,"get","post",Route = null)] HttpRequest req,ILogger log)
        {
            var instance = new User
            {
                Name1 = "foo",Name2 = "bar"
            };
            log.LogInformation("Test1: {$Test}",instance);
            log.LogInformation("Test2: {@Name}",instance);
            log.LogInformation("Test3: {@Name}",new { Name1 = "abc",Name2 = "def" });
            log.LogInformation("Test4: {Vorname} {Nachname}",instance.Name1,instance.Name2);
            return new OkObjectResult("");
        }
    }
    public class User
    {
        public override string ToString()
        {
            string str = "{ Name1 = " + Name1 + ",Name2 =" + Name2 + " }";
            return str;
        }
        public string Name1 { get; set; }
        public string Name2 { get; set; }
    }
}

你会得到:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?