Asp.net core 将对象作为json发送到Sentry.io
我们在我们的网站上使用Sentry.AspNetCore NuGet包,并在这里和那里注入Asp.net core 将对象作为json发送到Sentry.io,asp.net-core,asp.net-core-2.1,sentry,Asp.net Core,Asp.net Core 2.1,Sentry,我们在我们的网站上使用Sentry.AspNetCore NuGet包,并在这里和那里注入ILoggers。 有没有办法使用“结构化日志语法”并将Sentry日志对象设置为JSON,而不只是调用ToString() 编辑: 一些澄清。我们仍然使用NLog来写入文件,我们只是在Program.cs中添加了UseSentry,并保留了所有ILogger的用法。除了Sentry(?)只使用ToString来序列化传递给消息字符串的对象之外,它的工作原理与预期的一样。 我们问题的解决方案可能是以某种方式
ILogger
s。
有没有办法使用“结构化日志语法”并将Sentry日志对象设置为JSON,而不只是调用ToString()
编辑:一些澄清。我们仍然使用NLog来写入文件,我们只是在
Program.cs
中添加了UseSentry
,并保留了所有ILogger
的用法。除了Sentry(?)只使用ToString
来序列化传递给消息字符串的对象之外,它的工作原理与预期的一样。我们问题的解决方案可能是以某种方式将自定义格式化程序注入Sentry logger。否则,我们将不得不在我们可能要记录的每个类上重写
ToString
,或者自己添加序列化,或者在记录时创建匿名对象
(匿名对象的日志记录“起作用”,因为编译器生成一个自定义的.ToString()
重写,列出所有属性及其字符串化值。
示例:)即使我看到了,请尝试从字符串格式中删除@
:
新的TestClass()代替了\u logger.LogError(“testObj={@testObj}”)代码>
写入:\u logger.LogError(“testObj={testObj}”,new TestClass())代码>
我怀疑可能是NLog支持更改格式化程序
如果我在没有NLog的情况下运行,则添加:
logger.LogCritical({number}-具有复杂对象的事件:{object}),1,新
{
Name=“狂热者”,
Health=“100%”,
});
我在哨兵中看到:
1-具有复杂对象的事件:{Name=Zealot,Health=100%}
在使用Sentry.NLog时,这可能是一个限制。即使我看到了,请尝试从字符串格式中删除@
:
新的TestClass()代替了\u logger.LogError(“testObj={@testObj}”)代码>
写入:\u logger.LogError(“testObj={testObj}”,new TestClass())代码>
我怀疑可能是NLog支持更改格式化程序
如果我在没有NLog的情况下运行,则添加:
logger.LogCritical({number}-具有复杂对象的事件:{object}),1,新
{
Name=“狂热者”,
Health=“100%”,
});
我在哨兵中看到:
1-具有复杂对象的事件:{Name=Zealot,Health=100%}
当使用Sentry.NLog时,这可能是一个限制。实际上,NLog示例也可以工作;是的,匿名对象按“预期”进行序列化,但当您有一个类型化的类时不会。匿名类似乎有一个看起来几乎像JSON的ToString重写。也许有一种方法可以覆盖格式化程序?那听起来像个bug。你介意在GitHub上提一个吗?我认为这本身不是一个bug,更可能是一个功能请求。也许它可以与NLog(和其他)的工作方式相同,在参数名之前的@告诉格式化程序将参数序列化为JSON,而不是使用ToString;是的,匿名对象按“预期”进行序列化,但当您有一个类型化的类时不会。匿名类似乎有一个看起来几乎像JSON的ToString重写。也许有一种方法可以覆盖格式化程序?那听起来像个bug。你介意在GitHub上提一个吗?我认为这本身不是一个bug,更可能是一个功能请求。也许它可以与NLog(和其他)的工作方式相同,因为参数名前的@告诉格式化程序将参数序列化为JSON,而不是使用ToString。为了将来参考,github上的问题如下:
_logger.LogError("testObj = {@testObj}", new TestClass());
// (The @ forces NLog to serialize object as JSON. Looks like it's used in some of the other logging frameworks as well.)
public class TestClass
{
public string SomeProp { get; } = "SomeValue";
public int AnotherProp { get; } = 1337;
}
// Preferred message: testObj = {"SomeProp":"SomeValue","AnotherProp":1337}
// Actual Message: testObj = MyNameSpace.TestClass