我将 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 调用)来克服这个问题。当我这样做时,一切正常(我看到两个日志输出)。
我想了解为什么日志记录不能按照我最初想要实现的方式工作。有什么我错过的吗?