如何记录事件属性而不将其放入消息中?

问题描述 投票:0回答:3

我目前使用NLog来登录Json格式。我想将事件参数记录在“eventProperties”下的日志中,而不将它们包含在消息属性中。

当前nlog.config:

<target name="jsonFile" xsi:type="Console">
  <layout xsi:type="JsonLayout">
    <attribute name="time" layout="${longdate}" />
    <attribute name="level" layout="${level:upperCase=true}"/>
    <attribute name="message" layout="${message}" />
    <attribute name="eventProperties" encode="false" >
      <layout xsi:type='JsonLayout' includeAllProperties="true"  maxRecursionLimit="6"/>
    </attribute>
  </layout>
</target>

当前调用它:

_logger.LogDebug(20, "Doing hard work! {logInfo}", t2);

记录以下内容:

{ "time": "2022-05-19 08:24:15.1395", "level": "DEBUG", "message": "Doing hard work! Test", "eventProperties": { "logInfo": {"MyProperty":"Hello2", "MyProperty2":"Testing2", "MyModel":{"MyProperty":"Hello", "MyProperty2":"Testing"}}, "EventId": 20 } }

但是,我希望能够使用以下内容进行日志记录,而不会阻止 t2 记录在 JSON 的 eventProperties 部分中:

_logger.LogDebug(20, "Doing hard work!", t2);

并且消息属性的输出不再包含

test

"message": "Doing hard work!"

如何从消息中删除属性而不将其从 eventProperties 中删除?

编辑 - 我正在使用 Microsoft ILogger 抽象

.LogDebug()

c# json .net logging nlog
3个回答
2
投票

您可以使用

raw=true
:

输出消息模板(而不是格式化消息)
    <attribute name="message" layout="${message:raw=true}" />

另请参阅:https://github.com/NLog/NLog/wiki/How-to-use-structed-logging

另请参阅:https://github.com/NLog/NLog.Extensions.Logging/wiki/NLog-properties-with-Microsoft-Extension-Logging


0
投票

遇到同样的问题,实际上我发现的唯一“正确”且可用的解决方案是将

NLog.config
更改为不显示
${message}
,而是将“人类可读”消息放在
${event-properties:message}

带有

Logger
,即来自 Microsoft 日志扩展的
ILogger
:

Logger.LogInformation("{message}{MyProperty1}{MyProperty2}","your message", "property1value", "property2value");
<targets>
    <target name="logfile" xsi:type="File"
            fileName="Log/${shortdate}_log.txt"
            layout="${longdate}|${level}|${event-properties:MyProperty1}|${event-properties:MyProperty2}|${event-properties:message}">
    </target>
</targets>

0
投票

根据 Rolf Kristensen 提供的链接中的内容添加此回复

object hiddenPropValue = "hello world";
myILoggerInstance.Log(Microsoft.Extensions.Logging.LogLevel.Debug,default(EventId), new MyLogEvent($"Some log message not containing the property").WithProperty("HiddenProp", hiddenPropValue),
     (Exception)null,
     MyLogEvent.Formatter);

class MyLogEvent : IEnumerable<KeyValuePair<string, object>>
{
    List<KeyValuePair<string, object>> _properties = new List<KeyValuePair<string, object>>();

    public string Message { get; }

    public MyLogEvent(string message)
    {
        Message = message;
    }

    public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
    {
        return _properties.GetEnumerator();
    }
    public MyLogEvent WithProperty(string name, object value)
    {
        _properties.Add(new KeyValuePair<string, object>(name, value));
        return this;
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public static Func<MyLogEvent, Exception, string> Formatter { get; } = (l, e) => l.Message;
}
© www.soinside.com 2019 - 2024. All rights reserved.