我们有一个WEB API应用程序,根据级别进行日志记录
- 信息
- 调试和
- 错误
每个日志级别都记录到不同的文件中,例如["Info"
=>Info.log;"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>
我的问题是,有没有办法EscapeImpersonation
,我们的错误将按照Info
和Debug
记录?我们不能向用户授予日志写入权限,因为这不在我们的权限范围内。
请注意,上面的例子是简化的。在实际实现中,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.
}