Serilog打印上下文属性

时间:2016-06-26 16:42:00

标签: serilog

我正在使用Serilog并希望打印包含上下文属性的一些信息消息。

例如:

var logger = Log.ForContext("FirstName", "Yosi");
logger.Information("Hello {FirstName}")

并且这可以正常工作,但是当我将参数添加到日志消息中时,我会得到意想不到的结果。

var logger = Log.ForContext("FirstName", "Yosi");
logger.Information("Hello {FirstName} {LastName}", "Attias")

我希望结果是:

  

你好Yosi Attias

但我明白了:

  

您好Attias {LastName}

有没有解决方法?我错过了什么吗?或者这是一个错误?

2 个答案:

答案 0 :(得分:2)

仅根据传递给日志记录方法的参数评估消息模板。无论程序中的任何其他配置/上下文如何,日志语句都可以始终如一地工作。

如果要向日志记录输出添加其他属性,请将它们添加到正在配置的任何接收器的outputTemplate参数中:

Log.Logger = new LoggerConfiguration()
    .WriteTo.ColoredConsole(outputTemplate:
    "{Timestamp:HH:mm} [{Level}] ({LastName}) {Message}{NewLine}{Exception}")
    .CreateLogger();

答案 1 :(得分:0)

使用反射自动添加属性及其值以将它们全部记录在 Serilog 中:

public static Task GenericLog(MyClassLog myclassLog, string message=null)
{
    if (string.IsNullOrEmpty(message)) message = nameof(myclassLog);
    
    var properties = typeof(MyClassLog).GetProperties();

    var propertyEnrichers = new PropertyEnricher[properties.Length];

    for (int i = 0; i < properties.Length; i++)
        propertyEnrichers[i] =
            new PropertyEnricher(
                properties[i].Name,
                properties[i].GetValue(myclassLog)
                );

    var withProps = Log.ForContext(propertyEnrichers);

    withProps.Debug(message);

    return Task.CompletedTask;
}