У нас есть приложение WEB API, которое регистрирует в соответствии с уровнями
- Информация
- Отладка и
- Ошибка
Каждый уровень журнала записывается в отдельный файл, например, [ "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{}
и ведением журнала .