Dar*_*ell 3 serilog getseq seq-logging
我有一个具有多个属性的对象,这些属性与我网站上刚刚发生的事件相关。
我想记录此事件,并将其每个属性显示在 Seq 中 - 作为属性。但是想要从实际的日志消息文本中省略大部分属性 - 所以我不希望它们出现在消息模板中。v
如果我这样做:
var logInfo= new LogInfo() {Foo = 1, Bar= "Pending"};
logger.Information("{@event}", logInfo);
Run Code Online (Sandbox Code Playgroud)
在 Seq 中直接针对日志亮起的唯一属性是 @event 属性。它实际上看起来像这样:
所以我试过这个:
var enricher = new DnnLogInfoEnricher(logInfo);
using (LogContext.PushProperties(enricher))
{
Log.Logger.Information("Event: {logInfo}", logInfo.LogTypeKey, logInfo.Exception);
}
Run Code Online (Sandbox Code Playgroud)
但我对这种方法的担忧是,由于此方法将触发大量次数,因此我不想每次都创建一个新的丰富对象实例 - 因为我喜欢保持正在创建的对象数量通常尽可能低。只是因为我担心 GC 影响(也许我的担忧是没有根据的?)。
这是实现我想要的(即使用浓缩器)的正确/正确方法还是我错过了什么?
干杯!
SerilogForContext()已经针对这种场景进行了很好的优化,不会产生太多垃圾(它会尽可能避免它)。创建上下文的成本与开始记录数据的成本成正比。
var log = Log.ForContext("Info", logInfo, destructureObjects: true);
log.Information(logInfo.Exception, "Event happened");
Run Code Online (Sandbox Code Playgroud)
一个观察,您最好从捕获的对象中排除异常,并将其作为日志记录调用的第一个参数传递。要排除它,您可以在创建记录器时设置自定义策略:
Log.Logger = new LoggerConfiguration()
.Destructure.ByTransforming<LogInfo>(li => new {
li.BypassBuffering, li.LogConfigId, li.LogEventId, li.LogGUID
})
// <snip>
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
虽然ByTransforming()这里似乎增加了更多开销,但您应该能够通过仅挑选LogInfo.
另一件小事 - 没有必要调用Log.Logger静态类;直接Log有类似的方法Information(),如Log.Information(...).
| 归档时间: |
|
| 查看次数: |
1522 次 |
| 最近记录: |