NLog EventProperties in. NET Core - PullRequest
       24

NLog EventProperties in. NET Core

1 голос
/ 15 февраля 2020

Я использую ILogger<MyController> для записи журналов с использованием DI (см. шаг 6 )

Я также использую NLog EventProperties

Я хочу автоматически добавить traceId во все мои журналы в контроллере.

Это работает:

logger.Info("Some log. TraceId:{traceId}", 123);

Однако затем мне нужно изменить все команды журнала (многие из них) !), что является болью.

Если я сделаю следующее, это не безопасно:

using NLog;
public class MyController : Controller
{
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
    public MyConstructor(Apilog apilog)
    {
        Logger.SetProperty("traceid", apilog.TraceId);
    }
}

Есть ли способ использовать SetProperty с ILogger<MyController>?

Или какой-нибудь способ использования NLog с SetProperty быстрым и безопасным для потоков способом?

Заранее большое спасибо!

1 Ответ

1 голос
/ 15 февраля 2020

Когда вы разделяете логгеры между потоками, вы можете использовать WithProperty для обеспечения безопасности потоков.

Обратите внимание, что WithProperty / SetProperty доступно только для Logger из NLog. (поэтому не ILogger из Microsoft.Extensions.Logging`). См. Ниже.

Пример:

using NLog;
public class MyController : Controller
{
    private static readonly Logger BaseLogger = LogManager.GetCurrentClassLogger(); 

    private readonly Logger Logger; // non static because of traceid. 
    public MyConstructor(Apilog apilog)
    {        
        Logger = BaseLogger.WithProperty("traceid", apilog.TraceId);
    }
}

Есть ли способ использовать SetProperty с ILogger<MyController>?

Нет SetProperty на Интерфейс ILogger для Microsoft.Extensions.Logging, но вы можете сделать это:

using (_logger.BeginScope(new[] { new KeyValuePair<string, object>("traceid", apilog.TraceId) }))
{
   _logger.LogDebug("Log message");
}

И использовать в своей конфигурации: ${mdlc:traceid}. Подробности и опции здесь

...