条件适用时 Nlog 截断消息

问题描述 投票:0回答:1

在我的应用程序中,我想将发布或使用的任何 AMQP 事件记录到两个文件中。第一个日志文件是我的“主”文件,其中包含应用程序每一层的各种日志语句。第二个日志文件包含所有 AMQP 事件,仅包含其他内容。事件都是多行的,事件中的每个属性都有自己的行。

目前,该事件在具有所有属性的两个文件中均已记录,但我希望仅在“主”日志文件中包含第一行,而完整的日志语句仅在 AMQP 日志文件中。

将 AMQP 事件记录到单独的文件中是可行的,这是我的记录器:

<logger name="*" minlevel="Debug" writeTo="amqpEvents">
    <filters defaultAction="Ignore">
        <when condition="starts-with(message, 'Published Event')" action="Log"/>
    </filters>
</logger>

现在我需要一种方法来截断“主”日志文件中的消息。我尝试使用过滤器,但我找不到截断

action
部分中的消息的方法,因为它只需要一个枚举:

<logger name="*" minlevel="Debug" writeTo="file">
    <filters defaultAction="Log">
        <when condition="contains(message, '\r\n') and starts-with(message, 'Published Event')" action="Log"/> 
    </filters>
</logger>

不幸的是,我目前停留在 nlog 4.7,所以我无法使用最新的功能集。

nlog
1个回答
0
投票

NLog 日志记录规则处理 LogEvent 到所需输出目标的重定向。

NLog 目标配置处理输出格式,以及如何使用 NLog 布局将 LogEvent 转换为所需的输出。

我猜测您的主文件目标从应用程序中的所有位置接收 LogEvents,并且您希望从所有位置接收整个 LogEvent-Message,除了记录 AMQP 事件(具有换行符)时。

我认为你应该更改 AMQP 事件的 lgging。通过使用不同的 Logger-name 编写 2 个 LogEvents(并在 NLog-config 中在

<logger name="AMQP" minLevel="Debug" final="true" />
顶部添加
<rules>

NLog.LogManager.GetLogger("AMQP").Info(payloadWithNewLines);
NLog.LogManager.GetLogger("AppLog").Info(payloadForMainFile);

或者,您可以将完整的有效负载放入 NLog LogEventInfo.Properties 字典中(然后在

${event-properties:AMQP}
-目标的布局中使用
amqpEvents
):

NLog.LogEventInfo logEvent = LogEventInfo.Create(LogLevel.Info, null, payloadForMainFile);
logEvent.Properties["AMQP"] = payloadWithNewLines;
NLog.LogManager.GetLogger("AMQP").Log(logEvent);
© www.soinside.com 2019 - 2024. All rights reserved.