gpt4 book ai didi

c# - ServiceStack:RestService 中的异常未记录在 catch 子句中

转载 作者:行者123 更新时间:2023-11-30 17:57:01 24 4
gpt4 key购买 nike

我将 Log4Net 与 ServiceStack 结合使用。它在 Global.asax.cs 中初始化:

    protected void Application_Start(object sender, EventArgs e)
{
LogManager.LogFactory = new Log4NetFactory(true); //Also runs log4net.Config.XmlConfigurator.Configure()
new MyAppHost().Init();
}

我的 MyAppHost 类中有一个静态日志对象:

public class MyAppHost : AppHostBase
{
public static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(TvDAppHost).Name);
// ...

..我有这样的休息服务:

public class MyService : RestServiceBase<MyResponse>
{
public override object OnPost(ProfileSync request)
{
MyAppHost.Log.Info("Posting to MyService");

MyResponse response;
var myOperator = new Operator();
response = myOperator.DoSomething();

return new MyDto();
}
}

public class Operator {

public MyResponse DoSomething()
{
MyResponse r = new MyResponse();
try{
r.Stuff = DoStuff();
}
catch(Exception e)
{
// this will not be logged!!
MyAppHost.Log.Error("Exception: " + e);
r.Error = true;
}
return r;
}

private string DoStuff()
{
// Do something which can throw exceptions.
// Actually I'm doing Database work here.
return "stuff";
}

}

因此,当 Operator.DoSomething 中发生异常时,我在日志文件中既没有看到“Posting to MyService”也没有看到“Exception: xxx”。当没有异常发生时,这些日志条目会出现在日志文件中。

我可以通过将 try/catch 从 Operator.DoSomething 移动到 MyService 的 OnPost 方法来解决这个问题,围绕 DoSomething 调用。当我这样做时一切正常(我看到两个日志输出)。

我想了解为什么日志记录没有按照我最初想要实现的方式工作。我错过了什么吗?

最佳答案

虽然您的 Application_Start() 代码看起来像您想要使用 ServiceStack.Logging:

LogManager.LogFactory = new Log4NetFactory(true);

您没有在代码的其他任何地方使用 ServiceStack.Logging 接口(interface),例如

public static readonly log4net.ILog Log = 
log4net.LogManager.GetLogger(typeof(TvDAppHost).Name);

代替 ServiceStack 的 ILog 接口(interface):

public static readonly ILog Log = LogManager.GetLogger(typeof(TvDAppHost));

另一个异常是您没有为每个类设置单独的记录器,而是共享静态 AppHost 记录器。

由于 ServiceStack 只是将日志记录委托(delegate)给底层提供者,问题出在 Log4Net 而不是 ServiceStack,但问题可能与 Log4Net 使用 ThreadStatic 有关,因为在 WebWorker 中记录日志的线程与创建 MyAppHost 的线程不同.日志.

关于c# - ServiceStack:RestService 中的异常未记录在 catch 子句中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13564591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com