NLog: войти в отдельный файл, если поле заполнено - PullRequest
0 голосов
/ 17 октября 2018

У меня есть набор служб Windows - всего 7.Эти сервисы отслеживают различные аспекты различных рабочих процессов.

В них я устанавливаю поле с именем scanid:

public static void SetScanid(this ILogger logger, int? scanid)
{
    GlobalDiagnosticsContext.Set("scanid", scanid);
}

в файле nlog.config, я использую его для заполнения частижурналы для быстрого поиска / поиска:

<variable name="messageLayout" value="[${longdate}] -- [SID:${gdc:item=scanid}] ... " />

В начале любого данного процесса я устанавливаю SCANID и в конце очищаю его.

Теперь в 7 различных файлах журнала,У меня SID в качестве поля для поиска.

Могу ли я вместо этого: создать цель, которая регистрирует данный файл ТОЛЬКО при заполнении этого поля?

Скажем, что-то вроде

<target xsi:type ="File"
    name="sidTarget"
    fileName="Logs\Process-${gdc:item=scanid}.log"
    when=" ??? scanid is not null or empty ??? "
    ... />

Или в правилах есть что-то, что могло бы это охватить?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Альтернативным решением может быть использование цели NLog FallbackGroup.Это позволяет группировать несколько целей, чтобы они стали одной целью.Если первая цель в группе терпит неудачу, то она будет повторять попытку для следующей цели в группе (используя другое имя файла).

См. Также https://github.com/nlog/NLog/wiki/FallbackGroup-target

0 голосов
/ 18 октября 2018

Вы можете настроить это в разделе <rules>.

например,

<logger name="*" writeTo="sidTarget">
  <filters>
    <when condition="length('${gdc:item=scanid}') == 0" action="Ignore" />
  </filters>
</logger> 

См. фильтрация сообщений журнала и <when> документы

...