Лучшие практики Log4net для работы с несколькими арендаторами (1 выходной файл) - PullRequest
0 голосов
/ 09 мая 2018

Итак, мое решение webapi работает с несколькими арендаторами, и я хочу, чтобы логирование было примерно таким:

2018-05-09 11: 06: 00,490 ((tenantId)) [12] Имя метода INFO - журналы

2018-05-09 11: 07: 00,490 ((значение по умолчанию, если вызов не на уровне арендатора)) [12] имя метода предупреждения - журналы

Моя идея для решения проблемы состояла в том, чтобы добавить tenantId вручную, используя

log4net.ThreadContext.Properties["tenantId"] = tenantId;

Но опять же, у меня нет доступа к tenantId на каждом уровне решения. Я пытался добавить его в свой базовый контроллер (который реализует ApiController) выглядит так

protected override void Initialize(HttpControllerContext 
controllerContext)
{
    var tenantIdentifier = 
    requestUtils.GetTenantHeader(controllerContext.Request);
    if (tenantIdentifier != null)
       log4net.ThreadContext.Properties["tenantId"] = tenantIdentifier;
    else
       log4net.ThreadContext.Properties["tenantId"] = "default";
    await SetTenantIdentifier(tenantIdentifier);
    base.Initialize(controllerContext);
}

Проблема этой идеи заключается в том, что для меня setTenantId нужно подождать, но я не могу сделать метод Initialize a Task (async).

1 Ответ

0 голосов
/ 10 мая 2018

В итоге я решил await SetTenantIdentifier(tenantIdentifier); без вызова await, но он не работал, и Log4net.ThreadContext.Properties["tenantId"] = tenantIdentifier; вернул бы ноль в журналах контроллера, но работал в базовом контроллере (потому что он менял потоки между вызовами)

2018-05-10 13: 59: 21 289 (арендатор) [8] INFO - Базовый контроллер - Идентификатор арендатора установлен на арендатора

2018-05-10 13: 59: 21 504 ((null)) [12] INFO - Тестовый контроллер - Привет от контроллера

Поэтому я использовал Log4net.LogicalThreadContext.Properties["tenantId"] = tenantIdentifier; вместо Log4net.ThreadContext.Properties["tenantId"] = tenantIdentifier; , и это сработало.

РЕДАКТИРОВАТЬ: я написал ThreadContextв обеих строках, но я имел в виду, что вместо ThreadContext я использовал LogicalThreadContext.

...