NLog:将序列化对象记录为消息
NLog: log serialized object as message
我已经像这样设置 nlog.config 以将我的日志创建为 JSON
<target name='JsonFile' type='File' fileName='${basedir}/logs/nlog-${shortdate}.json'>
<layout type='JsonLayout'>
<attribute name='time' layout='${longdate}' />
<attribute name='level' layout='${level:upperCase=true}'/>
<attribute name='nested' encode='false' >
<layout type='JsonLayout'>
<attribute name='message' layout='${message}' encode='true' />
<attribute name='exception' layout='${exception}' />
</layout>
</attribute>
</layout>
</target>
记录场景:
public class MessageResult {
public string Message { get; set; }
public string IsSuccess { get; set; }
}
public class HomeController : Controller {
private readonly ILogger _logger;
*** Dependency injection for ILogger ***
public IActionResult Index() {
var message = new MessageResult() {
Message = "Json test message",
IsSuccess = true
};
var json = JsonSerializer.Serialize(message);
_logger.LogWarning(json);
return View();
}
}
记录的内容是:
{ "time": "2020-10-08 20:12:35.6472", "level": "WARN", "nested": { "message": "{\"Message\":\"Json test message\",\"IsSuccess\":true}" } }
但我想将消息记录为 JSON,而不是像我得到的那样的字符串
那我该怎么做呢?
您可以使用 Serilog。
Serilog 是一个现代记录器 framework.Serilog 默认提供结构化日志记录。
您可以使用 JsonFormatter 进行输出,甚至可以编写您自定义的格式化程序 (json,yaml,xml,...)
与其预先进行 JSON 序列化,不如让日志框架来完成。通过改变这个:
var json = JsonSerializer.Serialize(message);
_logger.LogWarning(json);
进入这个:
_logger.LogWarning("{@message}", message);
并将其用作配置:
<target name='JsonFile' type='File' fileName='${basedir}/logs/nlog-${shortdate}.json'>
<layout type='JsonLayout'>
<attribute name='time' layout='${longdate}' />
<attribute name='level' layout='${level:upperCase=true}'/>
<attribute name='nested' encode='false'>
<layout type='JsonLayout' includeAllProperties="true">
<attribute name='messagetemplate' layout='${message:raw=true}' />
<attribute name='exception' layout='${exception}' />
</layout>
</attribute>
</layout>
</target>
另请参阅:https://github.com/NLog/NLog/wiki/How-to-use-structured-logging
我已经像这样设置 nlog.config 以将我的日志创建为 JSON
<target name='JsonFile' type='File' fileName='${basedir}/logs/nlog-${shortdate}.json'>
<layout type='JsonLayout'>
<attribute name='time' layout='${longdate}' />
<attribute name='level' layout='${level:upperCase=true}'/>
<attribute name='nested' encode='false' >
<layout type='JsonLayout'>
<attribute name='message' layout='${message}' encode='true' />
<attribute name='exception' layout='${exception}' />
</layout>
</attribute>
</layout>
</target>
记录场景:
public class MessageResult {
public string Message { get; set; }
public string IsSuccess { get; set; }
}
public class HomeController : Controller {
private readonly ILogger _logger;
*** Dependency injection for ILogger ***
public IActionResult Index() {
var message = new MessageResult() {
Message = "Json test message",
IsSuccess = true
};
var json = JsonSerializer.Serialize(message);
_logger.LogWarning(json);
return View();
}
}
记录的内容是:
{ "time": "2020-10-08 20:12:35.6472", "level": "WARN", "nested": { "message": "{\"Message\":\"Json test message\",\"IsSuccess\":true}" } }
但我想将消息记录为 JSON,而不是像我得到的那样的字符串 那我该怎么做呢?
您可以使用 Serilog。 Serilog 是一个现代记录器 framework.Serilog 默认提供结构化日志记录。 您可以使用 JsonFormatter 进行输出,甚至可以编写您自定义的格式化程序 (json,yaml,xml,...)
与其预先进行 JSON 序列化,不如让日志框架来完成。通过改变这个:
var json = JsonSerializer.Serialize(message);
_logger.LogWarning(json);
进入这个:
_logger.LogWarning("{@message}", message);
并将其用作配置:
<target name='JsonFile' type='File' fileName='${basedir}/logs/nlog-${shortdate}.json'>
<layout type='JsonLayout'>
<attribute name='time' layout='${longdate}' />
<attribute name='level' layout='${level:upperCase=true}'/>
<attribute name='nested' encode='false'>
<layout type='JsonLayout' includeAllProperties="true">
<attribute name='messagetemplate' layout='${message:raw=true}' />
<attribute name='exception' layout='${exception}' />
</layout>
</attribute>
</layout>
</target>
另请参阅:https://github.com/NLog/NLog/wiki/How-to-use-structured-logging