ServiceStack:RestService中未记录RestService中的异常

时间:2012-11-26 12:10:22

标签: c# exception-handling servicestack

我正在使用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类中有一个静态Log对象:

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中的异常时,我既没有在我的日志文件中看到“发布到MyService”,也没有看到“异常:xxx”。 当没有异常发生时,这些日志条目将出现在日志文件中。

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

我想理解为什么日志记录不能像我想要的那样实现它。有没有我错过的东西?

1 个答案:

答案 0 :(得分:1)

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

LogManager.LogFactory = new Log4NetFactory(true);

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

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的线程不同日志。