Serilog:使用其他属性

时间:2018-01-25 11:53:59

标签: serilog

我尝试使用{Properties}(不在消息模板中)将其他属性写入日志:

使用过(FileSink)模板:

"[{Level}] {Message}{NewLine}{Properties}{NewLine}{Exception}"

日志操作(简化,通常是对象数组由方法参数给出):

Log.Information("Start logging",
    new object[]{
        new { Version = "VersionString"},
        new { StartDate = DateTime.Now },
        new { Id = Guid.NewGuid() }
    });

我也累了:

Log.Information("Start logging",
    new object[]{
        "VersionString",
        DateTime.Now,
        Guid.NewGuid()
    });

我查看了LogEventPropertyCapturingTeststhis PR,但我无法让它正常工作......

更新 我使用这样的包装函数:

public static void Information(string messageTemplate, object[] propertyValues, bool show = false, [CallerMemberName] string callerMethodeName = "", [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumer = -1)
{
    using (LogContext.PushProperty("CallingContext", new { callerMethodeName, callerFilePath, callerLineNumer }))
    {
        _MainLog.Information(messageTemplate, propertyValues);
    }

    if(show)
    {
        // Code to show a the event to the user
    }
}

Update2 找到一种方法,但它不是很好,因为模板属性匹配基本。

public static void Information(string messageTemplate, object[] propertyValues, bool show = false, [CallerMemberName] string callerMethodeName = "", [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumer = -1)
{
    using (LogContext.PushProperty("CallingContext", new { callerMethodeName, callerFilePath, callerLineNumer }))
    {
        Regex matchProperties = new Regex("{[^}]+}");

        int usedPropertiesCount = matchProperties.Matches(messageTemplate).Cast<Match>().Select(m => m.Value).Distinct().Count();

        if (propertyValues.Length > usedPropertiesCount)
        {
            using (LogContext.PushProperty("AdditionalData", propertyValues.Skip(usedPropertiesCount)))
            {
                _MainLog.Information(messageTemplate, propertyValues);
            }
        }
        else
        {
            _MainLog.Information(messageTemplate, propertyValues);
        }
    }

    if(show)
    {
        // Code to show a the event to the user
    }
}

1 个答案:

答案 0 :(得分:2)

ForContext()方法会执行此操作:

Log.ForContext("Version", "VersionString")
    .ForContext("Id", Guid.NewGuid())
    .Information("Start logging");

(我省略StartDate因为所有Seri​​log事件都已加上时间戳。)

This blog post series包含一些关于消息模板以及上下文和相关性的帖子,其中包含此内容和其他替代方案。