WinForm、ASP.NET、MVCはグローバルエラーログを記録する
以前、「C#はLog 4 Netを使ってログを記録する」という記事を転載しましたが、エラーログであれば、メソッドごとに異常をキャプチャしてログを記録する必要はありません.このとき、グローバルなエラーログの記録方法を書けばいいのですが、このグローバルはいったいどこに書くべきですか?
プロジェクトによって書くところが違います:WinForm、ASP.NET、MVC
WinForm:Program.csファイルに
ASP.NET:Global.asax.csファイルに
MVC:HandleErrorAttributeを継承するクラスを書き、ファイルFilterConfig.csにフィルタを追加
最後に、ログ4 Netコンポーネントでエラーログを記録する方法を自分で書くことができます.
グローバルレコードログを使用するため、一般的にはlog 4 netを1つしか作成しません.ILogインスタンスですので、ログを頻繁に記録する場合は、インスタンスが他のスレッドに占有されている場合に記録できない問題を考慮する必要があります.解決策は次のとおりです.
1、単一スレッドでロックを使う.この方法は、ロック待ちをもたらしやすく、リソースの浪費をもたらす.
2、各プロファイルごとにappenderノードごとに追加
プロジェクトによって書くところが違います:WinForm、ASP.NET、MVC
WinForm:Program.csファイルに
///
/// 。
///
[STAThread]
static void Main()
{
//
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
// UI
Application.ThreadException += Application_ThreadException;
// UI
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
#region
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
#endregion
}
// UI
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
Exception error = e.Exception as Exception;
//
}
// UI
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Exception error = e.ExceptionObject as Exception;
//
}
ASP.NET:Global.asax.csファイルに
void Application_Error(object sender, EventArgs e)
{
//
Exception error = Server.GetLastError().GetBaseException();
//
}
MVC:HandleErrorAttributeを継承するクラスを書き、ファイルFilterConfig.csにフィルタを追加
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
// 。
filters.Add(new MyExceptionFilterAttribute());
}
}
///
///
///
public class MyExceptionFilterAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
//
Exception error = filterContext.Exception;
//
}
}
最後に、ログ4 Netコンポーネントでエラーログを記録する方法を自分で書くことができます.
グローバルレコードログを使用するため、一般的にはlog 4 netを1つしか作成しません.ILogインスタンスですので、ログを頻繁に記録する場合は、インスタンスが他のスレッドに占有されている場合に記録できない問題を考慮する必要があります.解決策は次のとおりです.
1、単一スレッドでロックを使う.この方法は、ロック待ちをもたらしやすく、リソースの浪費をもたらす.
2、各プロファイルごとにappenderノードごとに追加
3、マルチスレッドを単一スレッドに変換:データベースキューを採用する.まずログをデータベースキューに記録し、キューの情報を一定時間おきにファイルに記録し、記録した後にキューを空にします.