NLog VS Windows .Identity.Impersonate () - PullRequest
       70

NLog VS Windows .Identity.Impersonate ()

0 голосов
/ 19 февраля 2020

У нас есть приложение WEB API, которое регистрирует в соответствии с уровнями

  1. Информация
  2. Отладка и
  3. Ошибка

Каждый уровень журнала записывается в отдельный файл, например, [ "Info" => Информация. журнал ; "Debug" => Debug.log ; "Error" => Error.log ] .
Во время разработки они работали.

Однако при развертывании в другой среде , Error не было зарегистрировано.
Мы знаем, что произошла ошибка приложения, так как Вызов API статус 500 .
Были журналы для Info и Debug. Но ничего за Error

После некоторой детективной работы мы сузили, что Error не регистрирует как
он был брошен внутрь Impersonation using(){} блока .

var logger = NLog.LogManager.GetCurrentClassLogger();

logger.Info("Some info message.");    // works
logger.Debug("Some debug params.");   // works

var wid = User.Identity as System.Security.Principal.Windows.Identity;
using(wid.Impersonate())
{
    try
    {
        throw new Exception("Something happened.");
    }
    catch(Exception e)
    {
        logger.Error(e, e.Message); // not logging.
    }
}

Мы пришли к выводу, что олицетворенный пользователь не имеет прав на запись в местоположение журнала.
Мы подтвердили, что Error было работая путем изменения уровней журнала для Error с :

<rules>
    <!-- no logs -->
    <logger name="Error" minlevel="Error"  maxlevel="Error" writeTo="errorLogFile" />

    <!-- log files created and written to -->
    <logger name="Info"  minlevel="Info"  maxlevel="Info" writeTo="infoLogFile" />
    <logger name="Debug" minlevel="Debug" maxlevel="Debug" writeTo="debugLogFile" />
</rules>

до :

<rules>
    <!-- log files created and written to -->
    <logger name="Error" minlevel="Info"  maxlevel="Error" writeTo="errorLogFile" />

    <!-- log files created and written to -->
    <logger name="Info"  minlevel="Info"  maxlevel="Info" writeTo="infoLogFile" />
    <logger name="Debug" minlevel="Debug" maxlevel="Info" writeTo="debugLogFile" />
</rules>

У меня вопрос, есть ли способ Escape Impersonation, чтобы наши ошибки регистрировались согласно Info и Debug? Мы не можем предоставлять пользователям права на запись в журнал, поскольку это не входит в нашу компетенцию.

Обратите внимание, что приведенный выше пример упрощен. В реальной реализации есть дополнительные вызовы методов внутри блока try{} с их собственными try{}catch{} и ведением журнала .

1 Ответ

0 голосов
/ 21 февраля 2020

Вы можете обработать исключение из области олицетворения.

Так что не:

using(wid.Impersonate())
{
    try
    {
        throw new Exception("Something happened.");
    }
    catch(Exception e)
    {
        logger.Error(e, e.Message); // not logging.
    }
}

Но

try
{
    using (wid.Impersonate())
    {
        throw new Exception("Something happened.");
    }
}
catch (Exception e)
{
    logger.Error(e, e.Message); // not logging.
}

или перебросить и записать:

try
{
    using (wid.Impersonate())
    {
        try
        {
            throw new Exception("Something happened.");
        }
        catch (Exception e)
        {
            // do something;
            throw; //rethrow for logging;
        }
    }
}
catch (Exception e)
{
    logger.Error(e, e.Message); // not logging.
}
...