我目前使用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()
您可以使用
raw=true
: 输出消息模板(而不是格式化消息)
<attribute name="message" layout="${message:raw=true}" />
另请参阅:https://github.com/NLog/NLog/wiki/How-to-use-structed-logging
遇到同样的问题,实际上我发现的唯一“正确”且可用的解决方案是将
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>
根据 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;
}