记录前检查 NLog minlevel?

Check NLog minlevel before logging?

我想让开发人员使用 NLog 将对象记录为 JSON。为此,我需要在发送到 nLog 之前或在发送到目标之前实现一些逻辑。

我可以构建自己的 Target(TargetWithLayout),但我无法找到一种方法来从配置中检查此特定 target/logger 的日志级别?另一个缺点是我需要为我们将使用的每个目标(EventLog、File、WebService 等)创建一个新的 TargetWithLayout class。

另一种解决方案是在我使用 NLog 的 LogHandler 中执行此操作。知道我是否应该翻译对象的唯一方法可能是从配置文件中读取所有记录器,如果其中任何一个被设置为记录对象,那么我将序列化。但是,我不确定我是否可以从 LogHandler 检查此信息(无需手动操作)?

您可以使用 NLog json 布局在您的日志文件中写入 json,无需自行检查和序列化:

<target name="jsonFile" xsi:type="File" fileName="${logFileNamePrefix}.json">
      <layout xsi:type="JsonLayout">
              <attribute name="time" layout="${longdate}" />
              <attribute name="level" layout="${level:upperCase=true}"/>
              <attribute name="message" layout="${message}" />
       </layout>
</target>

日志消息格式由 NLog 处理,而不是您自己处理。

release notes nlog

您可以使用 NLog-Logger 对象来查询活动的日志记录规则:

if (myLogger.IsTraceEnabled)
   myLogger.Trace("Hello World");

补充一些理论;)

Another drawback is that I need to make a new TargetWithLayout class for each target that we will use (EventLog, File, WebService and so on).

这就是 NLog 中有 Layouts 的原因。这些是可以在目标中使用的布局,但它们独立于目标。

(不要与布局渲染器混淆,那些 ${..} 东西。)

有多种布局(纯文本、CSV、JSON)(参见list) , and you could easily add your own layout, analogous to adding a custom Target / Layout renderer, see the wiki