我可以在 NLog 的一个目标中使用两种不同的布局吗?

Can I use two different layouts in one target in NLog?

我在 nlog.config 中有两个布局。一次是默认布局,另一个是 ErrorLayout,其中具有其他属性。 问题是我想添加目标,我想为 LogLevel.Error 使用两种布局,我必须使用 ErrorLayout,对于其他级别,我必须使用 DefaultLayout。我不想创建两个目标,因为两个目标创建两个不同的文件并将日志存储到其中。 但我想将两者布局到一个目标中。 我能做到吗?如何 ? 谁能帮我做这个?

现在你的 DefaultLayoutErrorLayout 很简单,所以你可以这样做:

<nlog>
    <variable name="DefaultLayout" value="${message}" />
    <variable name="ErrorLayout" value="${message} ${exception:format=tostring}" />
    <variable name="DynamicLayout= value="${when:when=level<=LogLevel.Info:inner=${DefaultLayout}:else=${ErrorLayout}}" />

    <targets>
        <target type="file" name="erp" layout="${DynamicLayout}" fileName="log-${shortdate}.log" />
    </targets>

    <rules>
        <logger name="*" minLevel="Debug" writeTo="erp" />
    </rules>

</nlog>

另见 https://github.com/nlog/NLog/wiki/When-Layout-Renderer

请注意,如果您在 ErrorLayout 中包含繁重的布局渲染,NLog 的性能可能会很差。前任。喜欢 ${callsite}

另一种选择是使用两个目标,以同一个文件为目标。如果你不启用keepfileopen,那么这也是一个很好的解决方案。

例如:

<nlog>
    <targets>
        <target type="file" name="erp" layout="${message}" fileName="log-${shortdate}.log" />
        <target type="file" name="erp-error" layout="${message} ${exception:format=tostring}" fileName="log-${shortdate}.log" />
    </targets>

    <rules>
        <logger name="*" minLevel="Error" writeTo="erp-error" final="true" /> <!-- after match events won't be processed futher due to the final attribute -->
        <logger name="*" minLevel="Debug" writeTo="erp" />
    </rules>
</nlog>