NLog Web服务目标,基于日志级别的松弛图标

时间:2019-03-21 17:56:30

标签: nlog

我是NLog的新手,正在努力寻找解决方案。

我想发出警告,并且将其推送到带有日志级别特定图标的闲置频道。从技术上讲,我已经做到了。我有两对目标/记录器,它们被硬编码为仅捕获警告,错误和以上错误,并且将“警告”或“错误”图标硬编码为布局模板。

<target xsi:type="WebService"
        name="slackWarningTarget"
        url="https://hooks.slack.com/services/xx/xx/xx"
        protocol="JsonPost"
        encoding="utf-8"
        >

  <parameter name="text" type="System.String" layout=":warning: ${machinename} ${message}"/>
  <parameter name="channel" type="System.String" layout="xx"/>
</target>

<logger name="*" minlevel="Warn" maxlevel="Warn" writeTo="slackWarningTarget">

有没有更好的方法来做到这一点?我希望警告级别映射到:warning :,等等。

我也希望将一些信息级别的东西也推送到那里。为此,我创建了一个命名记录器,该记录器始终记录到松弛通道,但是如果警告或以上警告消息,则会导致重复消息。

<logger name="noticeLogger" writeTo="slackInfoTarget" />

我猜这两种方法都比我自己想出的要优雅得多。

1 个答案:

答案 0 :(得分:0)

您可以使用${when}从配置中完成此操作,例如

layout="${when:when=${level}=='Warn':inner=\:warning\::else:${when:when=${level}== 'Error':inner=\:error\::else:todo}}"

但是很快就会变得笨拙

另一个选择是注册自定义布局渲染器:

// register in the start of your program (e.g. main, app_start)
// usage ${slackIcon}
LayoutRenderer.Register("slackIcon", logEvent =>
{
    if (logEvent.Level == LogLevel.Warn)
    {
        return ":warning:";
    }
    if (logEvent.Level == LogLevel.Error)
    {
        return ":error:";
    }

    return ":other:";
    //etc
});

请参见How to write a custom layout renderer