NLog VS Windows.Identity.Impersonate()



我们有一个WEB API应用程序,根据级别进行日志记录

  1. 信息
  2. 调试
  3. 错误

每个日志级别都记录到不同的文件中,例如["Info"=>Info.log"Debug"=>Debug.log"Error"=>Error.log
在开发过程中,这些都发挥了作用。

但是当部署到另一个环境时,Error未被记录
我们知道API调用返回状态500时发生了应用程序错误
InfoDebug的日志。但Error没有

经过一些侦查工作,我们缩小了Error不是日志,因为
它被扔进了Impersonationusing(){}中。

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>

我的问题是,有没有办法EscapeImpersonation,我们的错误将按照InfoDebug记录?我们不能向用户授予日志写入权限,因为这不在我们的权限范围内。

请注意,上面的例子是简化的。在实际实现中,try{}块中还有其他方法调用,它们有自己的try{}catch{}logging

您可以处理模拟范围之外的异常。

所以不是:

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.
}

最新更新