Tenho um MessageTemplate padrão definido na minha Program.cs
classe que inclui as propriedades usuais:
string jsonOutputTemplate = "{ { ts: @t, lvl: @l, cid:CorrelationId, msg:@m, @x } }\n";
var loggerConfig = new LoggerConfiguration()
.MinimumLevel.Information()
.MinimumLevel.Override("System", syslogEventLevel)
.MinimumLevel.Override("Microsoft", syslogEventLevel)
.WriteTo.Async(a => a.Console(
new ExpressionTemplate(jsonOutputTemplate)
)
)
.Enrich.FromLogContext()
.Enrich.WithThreadId();
( CorrelationId
é uma propriedade que defini no meu código desde o início e quero incluir em todas as mensagens de log.)
Algumas das minhas mensagens de log precisam incluir algumas propriedades para indicar o intervalType
, method
e elapsedTime
com a mensagem de log desejada:
{"ts":"2025-04-21T14:49:42.4757362-06:00","lvl":"Information","cid":"2049403309","msg":"Transaction Time","intervalType":"totalTime", "method":"POST","elapsedTime":36}
Criei um objeto chamado totalTime
assim:
var totalTime = new { intervalType = "totalTime",
method = context.Request.Method,
elapsedTime = sw.ElapsedMilliseconds };
E então escrevo minha mensagem de log assim:
using (LogContext.PushProperty("totalTime", totalTime))
{
_logger.LogInformation("TransactionTime {@totalTime}", totalTime);
}
Meu problema é que a mensagem de log renderizada se parece com isso:
{"ts":"2025-04-21T15:33:41.1634571-06:00","lvl":"inf","cid":"2133411112","msg":" Transaction Time {\"intervalType\":\"totalTime\",\"method\":\"POST\",\"elapsedTime\":51}"}
Quero que as propriedades do meu objeto sejam cidadãos de primeira classe da minha mensagem de log, não incorporadas à msg:
propriedade. Tentei Compact.JsonFormatter
usar and @p
no meu modelo de saída, mas ele imprime um monte de propriedades que eu realmente não quero neste log específico; quero apenas meus ts
, lvl
, cid
, intervalType
, method
, e elapsedTime
.
Então, minha pergunta é: como ter um modelo padrão, mas para mensagens de log especiais, adicionar propriedades de primeira classe? (isso deve estar no formato JSON).
Obrigado, qualquer orientação é bem-vinda - os excelentes exemplos não parecem indicar exatamente o que estou procurando.
Primeiro, você precisa passar
true
para capturar as propriedades do seutotalTime
objeto:Em seguida, tente espalhar as propriedades de
totalTime
em seu modelo, por exemplo..totalTime
: