servicestack,C#,Exception Handling,servicestack" /> servicestack,C#,Exception Handling,servicestack" />

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

C# ServiceStack:RestService中的异常未记录在catch子句中,c#,exception-handling,servicestack,C#,Exception Handling,servicestack,我将Log4Net与ServiceStack一起使用。 它在Global.asax.cs中初始化: 受保护的无效应用程序\u启动(对象发送方,事件参数e) { LogManager.LogFactory=newlog4netfactory(true);//还运行log4net.Config.XmlConfigurator.Configure() 新建MyAppHost().Init(); } 我在MyAppHost类中有一个静态日志对象: 公共类MyAppHost:AppHostBase {

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

受保护的无效应用程序\u启动(对象发送方,事件参数e)
{
LogManager.LogFactory=newlog4netfactory(true);//还运行log4net.Config.XmlConfigurator.Configure()
新建MyAppHost().Init();
}
我在MyAppHost类中有一个静态日志对象:

公共类MyAppHost:AppHostBase
{
public static readonly log4net.ILog Log=log4net.LogManager.GetLogger(typeof(tvdaphost).Name);
// ...
…我有这样的休息服务:

公共类MyService:RestServiceBase
{
公共覆盖对象OnPost(ProfileSync请求)
{
MyAppHost.Log.Info(“发布到MyService”);
我的反应;
var myOperator=新运算符();
响应=肌操作员。剂量测定();
返回新的MyDto();
}
}
公共类运算符{
公共MyResponse DoSomething()
{
MyResponse r=新的MyResponse();
试一试{
r、 Stuff=DoStuff();
}
捕获(例外e)
{
//这将不会被记录!!
MyAppHost.Log.Error(“异常:+e”);
r、 错误=真;
}
返回r;
}
私有字符串DoStuff()
{
//做一些可以抛出异常的事情。
//实际上我在这里做数据库工作。
返回“东西”;
}
}
因此,当Operator.DoSomething中出现异常时,我在日志文件中既看不到“发布到MyService”也看不到“异常:xxx”。 当没有异常发生时,这些日志条目将显示在日志文件中

我可以通过将try/catch从Operator.DoSomething移动到MyService的OnPost方法来克服这个问题,方法是围绕DoSomething调用。 当我这样做的时候,一切都很好(我看到了两个日志输出)


我想了解为什么日志记录没有按照我一开始想要实现的方式工作。我有什么遗漏吗?

尽管您的
应用程序\u Start()
代码看起来像是您想要使用ServiceStack。使用以下方式记录:

LogManager.LogFactory = new Log4NetFactory(true);
您没有使用ServiceStack。在代码中的任何其他位置记录接口,例如

public static readonly log4net.ILog Log = 
    log4net.LogManager.GetLogger(typeof(TvDAppHost).Name);
代替ServiceStack的
ILog
接口:

public static readonly ILog Log = LogManager.GetLogger(typeof(TvDAppHost));
另一个异常情况是,对于每个类,您没有单独的记录器,而是共享静态AppHost记录器

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