我继承了一个使用 NLog 进行日志记录的 ASP.NET 应用程序。记录的属性之一是命名模块,它被硬编码为“核心”。这根本没有用,因为应用程序的所有部分(例如健康检查、各种业务上下文)都推送相同的值。
在某些情况下,我尝试使用结构化日志记录来覆盖此值(我现在无法重构整个日志记录)。
扩展方法
public static void LogInfoWithModule<T>(this ILogger<T> logger, string message, string module)
{
var escapedMessage = message.Replace("{", "{{");
escapedMessage = escapedMessage.Replace("}", "}}");
logger.Log(LogLevel.Information, "[{module}] " + escapedMessage, module);
}
用法
logger.LogInfoWithModule($"Health check response = {response}", Constants.LoggingModules.Health);
NLog 布局(为简洁起见,删除了大部分属性)
<target name="logJson" xsi:type="File">
<layout xsi:type="JsonLayout" includeAllProperties="true">
<attribute name="module" layout="${when:when='${event-properties:item=module}'=='':Core" />
</layout>
</target>
我得到想要的,那就是所有现有的调用都不会提供模块,它们会像以前一样工作。任何通过的日志LogInfoWithModule
都将覆盖默认值。
但是,我发现这个解决方案非常混乱,因为:
- 实际消息包含模块名称
- 无法使用结构化日志记录
- 不能延迟字符串格式化(通过向 Log 函数提供参数)