私はServiceStackでLog4Netを使用しています。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);
// ...
..そして私はこのようなRESTサービスを持っています:
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で例外が発生すると、ログファイルに「PostingtoMyService」も「Exception:xxx」も表示されません。例外が発生しない場合、それらのログエントリはログファイルに表示されます。
この問題は、try / catchをOperator.DoSomethingからMyServiceのOnPostメソッドに移動し、DoSomething呼び出しを囲むことで解決できます。それを行うと、すべてが正常に機能します(両方のログ出力が表示されます)。
そもそもロギングが思ったように機能しない理由を理解したいと思います。私が見逃したものはありますか?