Цель веб-сервиса NLog, слабый значок в зависимости от уровня журнала - PullRequest
1 голос
/ 21 марта 2019

Я новичок в 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 голосов
/ 21 марта 2019

Вы можете сделать это из конфигурации с помощью $ {когда} , например,

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
});

См. Как написать пользовательский макет рендеринга

...