WinForm、ASP.NET、MVC记录全局错误日志

之前我转载了一篇“C#使用Log4Net记录日志”,但如果是错误日志,则没必要在每个方法里面捕获异常再记录日志,这时我们写一个全局的错误日志记录方法就行了,但这全局到底应该写在哪呢?

不同的项目写的地方是不一样的:WinForm、ASP.NET、MVC

WinForm:在Program.cs文件里

        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [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());
        }
    }
    /// <summary>
    /// 自定义错误处理类
    /// </summary>
    public class MyExceptionFilterAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);
            //处理错误消息
            Exception error = filterContext.Exception;
            //记录日志         
        }
    }

最后,我们就可以自己写一个方法,用Log4Net组件记录错误日志。

由于采用全局记录日志,一般我们只创建一个log4net.ILog实例,因此在记录日志过于频繁的时候,应该要考虑实例被其它线程占用时无法记录的问题。解决方法如下:

1、单线程中用锁。这种方法容易造成锁等待从而造成资源浪费。

2、在每个配置文件每个appender节点里面添加

      <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->

      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
3、把多线程转为单线程:采用数据库队列。先把日志记录进数据库队列,再每隔一段时间把队列的信息记录成文件,记录后清空队列




  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
".NET Core", ".NET Framework", WPF (Windows Presentation Foundation), 和 WinForms (Windows Forms) 都是与 .NET 相关的技术,但它们有一些区别。 1. .NET Framework: - .NET Framework 是最早发布的 .NET 平台,它是用于构建 Windows 应用程序的一种技术框架。 - 它提供了广泛的类库和功能,用于开发各种类型的应用程序,包括桌面应用程序、Web 应用程序和服务应用程序等。 - .NET Framework 只能在 Windows 操作系统上运行,因此它对于跨平台开发是不够灵活的。 2. .NET Core: - .NET Core 是微软在 .NET 平台的下一代开发平台,它是一个跨平台的开源框架。 - .NET Core 支持在 Windows、macOS 和 Linux 等多个操作系统上运行,因此可以实现跨平台开发。 - 它具有较小的安装包大小、更快的性能和更好的可扩展性。 - .NET Core 提供了 ASP.NET Core(用于构建 Web 应用程序)和 EF Core(用于数据访问)等组件。 3. WPF (Windows Presentation Foundation): - WPF 是一种用于构建 Windows 桌面应用程序的用户界面技术。 - 它提供了丰富的界面设计功能,支持XAML(可扩展应用程序标记语言)来定义应用程序的用户界面。 - WPF 可以与 .NET Framework 或 .NET Core 一起使用。 4. WinForms (Windows Forms): - WinForms 是一种用于构建 Windows 桌面应用程序的用户界面技术。 - 它使用基于事件的编程模型,通过在窗体上添加控件来构建应用程序的用户界面。 - WinForms 只能与 .NET Framework 一起使用。 总结: .NET Core 是一个跨平台的开源框架,可以用于构建各种类型的应用程序,包括 Web 应用程序和桌面应用程序。.NET Framework 是一个仅限于 Windows 平台的框架,具有更广泛的类库和功能。WPF 和 WinForms 则是两种用于构建 Windows 桌面应用程序的用户界面技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值