我正在使用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来解决这个问题。 一切正常,然后我这样做(我看到两个日志输出)。
我想理解为什么日志记录不能像我想要的那样实现它。有没有我错过的东西?
答案 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的线程不同日志。