3

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

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

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

4

1 回答 1

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.Log 的线程不同。

于 2012-11-26T16:53:54.557 回答