【问题标题】:Custom log entry string formatting in NLog?NLog中的自定义日志条目字符串格式?
【发布时间】:2020-05-06 13:23:40
【问题描述】:

我是 NLog 的新手,想知道是否有办法编写以某种自定义方式格式化的日志条目?例如,以下是我想要对我的日志条目做的一些事情:

--> 具有嵌套的日志条目消息(不包括日志条目元数据),以使日志调用堆栈的深度更易于跟踪。这可以通过按您在日志调用堆栈中的深度按比例缩进日志条目字符串来完成

--> 使用所有相关的日志条目记录一个“更改 ID”(基本上是与正在处理的某个请求相关联的某种 ID)

我知道 NLog 有一些你可以使用的模板和东西,但我希望有更多的控制,以自定义格式化类或其他东西的形式,它会在我每次执行 Log.Info(...) 时拦截日志记录请求,然后根据我选择的行为适当地格式化我的日志条目字符串。

这可能吗?

编辑:

这是我当前的 NLog.config 文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" autoReload="true" throwExceptions="true" internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
   <targets>
      <target name="logfile" xsi:type="File" fileName="logfile.log" />
      <target name="logconsole" xsi:type="Console" />
   </targets>
   <rules>
      <logger name="*" minlevel="Trace" writeTo="logconsole" />
      <logger name="*" minlevel="Trace" writeTo="logfile" />
   </rules>
</nlog>

【问题讨论】:

标签: c# logging nlog


【解决方案1】:

一种方法是创建自定义布局渲染器。

有两种选择:

Lambda 方法

在加载其他 NLog 事物之前创建一个 lambda 方法并注册(注意静态),例如在 main() 中。

lambda 接收一个LogEventInfo,其中包括以下属性:Level、Message(未格式化)、FormattedMessage、Parameters(发送到 Log.Info)、可选 Exception 和 properties(命名参数)

//Create ${message-length}

// NLog 4.7+ syntax
NLog.LogManager.Setup().SetupExtensions(s =>
   s.RegisterLayoutRenderer("message-length", (logevent) => logEvent.FormattedMessage.Length)
);

如果您需要更多控制和选项,您还可以创建一个继承自 NLog.LayoutRenderers.LayoutRenderer 的类

1。设置

/// <summary>
/// E.g. usage:  ${MyFormatter:MyLayout:${uppercase}} or ${MyFormatter:${uppercase}}
/// </summary>
[LayoutRenderer("MyFormatter")]
public class MyFormatterLayoutRenderer: LayoutRenderer
{
    [RequiredParameter]
    public Layout MyLayout { get; set; }

    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
        var text = MyLayout.Render(logEvent);
        builder.Append(text);
    }
}

2。注册

你需要register the layout renderer:

// NLog 4.7+ syntax
NLog.LogManager.Setup().SetupExtensions(s =>
   s.RegisterLayoutRenderer<MyNamespace.MyFormatterLayoutRenderer>("MyFormatter")
);

3。用法

如下使用,设置一个目标的layout属性。例如:

<target name="logfile" xsi:type="File" fileName="logfile.log" layout="${message-length} - ${level} - ${message} - ${exception}"  />
<target name="logconsole" xsi:type="Console" layout="${message-length} - ${level} - ${message} - ${exception}" />

阅读更多here

【讨论】:

  • 感谢您的回答,但是由于我对 NLog 完全陌生,您能否将以下内容添加到您的代码中(对于您正在创建自定义类的第二种情况):1)编程示例使用日志记录,2)布局渲​​染类中的一些基本自定义字符串格式化行为,3)在 NLog.config 文件中更改什么以引用我的自定义布局渲染器?
  • 也许分享您当前配置的条纹版本?然后我可以在我的答案中添加它
  • 当然,我刚刚将它添加到我的问题中。
  • 更新了!希望对你有帮助!
  • 很抱歉,但我仍然不明白这对我有什么帮助..您能否将我在上面评论中提到的项目添加到您的答案中?它将帮助我了解如何使用MyFormatterLayoutRenderer 类进行一些自定义日志字符串格式...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2022-01-19
  • 2020-07-06
  • 1970-01-01
相关资源
最近更新 更多