从零开始编写自己的C#框架(20)——框架异常处理及日志记录
最近很忙,杂事也多,所以开发本框架也是断断续续的,终于在前两天将前面设定的功能都基本完成了,剩下一些小功能遗漏的以后发现再补上。接下来的章节主要都是讲解在本框架的基础上进行开发的小巧。
本框架主要有四种日志记录,分别是登陆日志、操作日志、手动收集异常日志和自动收集异常日志四种,大部分日志采集都不用开发者动手实现,在模板与相关的功能类中已自动帮我们将所需要的日志记录下来了。
登陆日志,记录的当然是用户登陆、退出、在线时长的日志,主要是在登陆(Login.aspx)、后端首页(Main.aspx,有一个退出按钮)和在线列表(OnlineUsersList.aspx,有踢除用户下线按钮)等几个页面使用,所使用到的逻辑层函数放在LoginLogBll.cs(用户登陆日志自定义逻辑类)与OnlineUsersBll.cs(OnlineUsersBll逻辑类)两个文件中。登陆页面主要是记录用户登陆系统的日志信息,而其他页面则是记录用户退出系统的日志信息,同时记录在线时长。当然后端首页有个定时器,会每分钟更新用户最后在线时间,以便用户退出系统时(或直接关闭浏览器后),相关的程序能及时记录用户退出信息及在线时长。
操作日志,记录的是用户在后端管理系统中,什么时间打开了那个页面,然后进行的是添加、修改、删除记录、更新状态、删除图片、踢除用户下线......等各种操作信息。方便出现问题时,管理人员能快捷的查出操作人员追究对应责任;也方便领导查看后端相关人员有没有使用系统,分析系统推广效果(很多OA或企业管理系统在企业购买回来后,不少员工都很抵触不去使用系统,造成花了很多钱购买来的系统成为摆设,当然这个操作记录并不能对这种情况的改善有很大的帮助,但至少让相关人员知道员工对系统的使用情况,哈哈...)
对于操作日志的记录,开发人员基本上不用去编写代码,因为在生成的模板函数中已全面的记录各种操作日志,除非自定义的函数中并没有去调用模板生成的添加、修改、删除等函数,直接使用SubSonic3.0插件接口或ADO.NET接口,那样的话就得自己编写代码记录了。而对于用户进入过那些页面的记录,由于后端系统开发的页面都必须继承PageBase类,每个后端页面打开时,都会运行该类的初始化函数,该初始化函数中会调用CommonBll.UserRecord(this)函数,忠诚的记录下用户的操作轨迹。
具体实现代码大家可以查看逻辑层生成的模板函数类,里面所有添加、修改、删除、更新函数,都会调用UseLogBll.GetInstence().Save()这个函数,记录用户进行了什么样的操作。而自定义函数想要记录用户操作说明,也可以直接调用这个函数,写上自定义操作说明。
手动收集异常日志,对于异常,有的朋友建议都将它抛出来,这样的话容易发现Bug,然后进行修复,但都是这样处理的话,用户体验就会比较差,所以我一般是数据层将异常抛出来,在逻辑层或UI层将它们都捕捉起来,然后在catch块中调用CommonBll.WriteLog("异常说明", e)把异常记录到文件中,当系统交付给使用方时,使用人员进行某些操作时,万一出现异常也只是显示失败或操作不了,而不会抛出黄页,需要维护时,只要使用方将软件或网站根目录下的Data文件夹打包发给开发人员即可分析查看异常问题所在。
当然对于那些需要非常详细的日志记录的程序,也可以将每一步执行的结果调用日志函数记录下来,方便开发人员分析问题。
对于手动收集异常的调用代码,大家可以查看逻辑层(Solution.Logic.Managers)的SubSonic文件夹下面的模板类和UI层代码。
自动收集异常日志,顾名思义就是自动记录所有我们没有捕捉到的异常。虽然我们上面已做了异常捕捉处理,但难免有些地方会忘记捕捉,那么我们就在全局异常处理那里将它记录下来。我们在Global.asax文件的Application_Error()函数中进行异常采集,收集服务器端页面发生的所有异常,调用自定义函数ErrorLogBll.GetInstence().Save()将它们记录到数据库中。
通过以上四种日志记录,基本上将我们需要的信息都记录了下来,协助我们排查安全问题、排查各种错误。
解决方案下载:(本解决方案忘了将之前注释掉的权限打开了...下次处理后再重新发出来吧)
说明:试过有朋友将所有章节中的解决方案都使用前面测试例子中的数据库,所以一直显示不了列表,所以查看过后才知道数据库没有记录引起的......所以在这里说明一下,在开发过程中,根据需要我会对数据表或字段进行增改操作,为了避免写太多的更新SQL语句,所以每个章节所配的数据库只是对应本章节,大家使用新的解决方案时就重新附加新的数据库。大家打开数据字典就会查看到,几乎对数据字典的每个修改我都有记录下来,方便大家比对。
版权声明:
本文由AllEmpty原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如有问题,可以通过1654937@qq.com 联系我,非常感谢。
发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:327360708 ,大家一起探讨。
更多内容,敬请观注博客:http://www.cnblogs.com/EmptyFS/
从零开始编写自己的C#框架(20)——框架异常处理及日志记录的更多相关文章
- python --- 20 约束 异常处理 MD5 日志
一.类的约束 1.抛出异常 NotImplementedError 2.抽象方法 含有抽象方法的类是抽象类 抽象类中的方法全是抽象方法的是接口 抽象类不能创建对象 二.异常处理 处理完后代码可继 ...
- 20 约束 异常处理 MD5 日志
三十九, 一.类的约束 1.抛出异常 NotImplementedError 2.抽象方法 含有抽象方法的类是抽象类 抽象类中的方法全是抽象方法的是接口 抽象类不能创建对象 二.异常处理 处理完 ...
- 从零开始编写自己的C#框架(1)——前言
记得十五年前自学编程时,拿着C语言厚厚的书,想要上机都不知道要用什么编译器来执行书中的例子.十二年前在大学自学ASP时,由于身边没有一位同学和朋友学习这种语言,也只能整天混在图收馆里拼命的啃书.而再后 ...
- 从零开始编写自己的C#框架 ---- 系列文章
目录: 从零开始编写自己的C#框架(1)——前言从零开始编写自己的C#框架(2)——开发前的准备工作从零开始编写自己的C#框架(3)——开发规范从零开始编写自己的C#框架(4)——文档编写说明从零开始 ...
- 从零开始编写自己的C#框架(17)——Web层后端首页
后端首页是管理员登陆后进入的第一个页面,主要是显示当前登陆用户信息.在线人数.菜单树列表.相关功能按键和系统介绍.让管理员能更方便的找到息想要的内容. 根据不同系统的需要,首页会显示不同的内容,比如显 ...
- 从零开始编写自己的C#框架(8)——后台管理系统功能设计
还是老规矩先吐下槽,在规范的开发过程中,这个时候应该是编写总体设计(概要设计)的时候,不过对于中小型项目来说,过于规范的遵守软件工程,编写太多文档也会拉长进度,一般会将它与详细设计合并到一起来处理,所 ...
- 从零开始编写自己的C#框架(25)——网站部署 【转】
服务器安全部署文档 目录1. 前言.. 3 2. 部署环境.. 3 2.1 服务器环境信息.. 3 3. 磁盘阵列配置.. 4 4. 安装操作系统.. ...
- 从零开始编写自己的C#框架(26)——小结
一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...
- 从零开始编写自己的C#框架(25)——网站部署
导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附 ...
随机推荐
- 【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器
一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从 ...
- 以bank account 数据为例,认识elasticsearch query 和 filter
Elasticsearch 查询语言(Query DSL)认识(一) 一.基本认识 查询子句的行为取决于 query context filter context 也就是执行的是查询(query)还是 ...
- 07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- SQL Server-聚焦计算列持久化(二十一)
前言 上一节我们结束了Hash Match Aggregate和Stream Aggregate的讲解,本系列我们来讲讲关于SQL Server中的计算列问题,简短的内容,深入的理解,Always t ...
- mac下安装及配置tomcat
mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...
- AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking
AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...
- (一)开篇—杂谈WebGIS
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 我相信大家对百度地图,谷歌地图等相关应用已经是非常熟悉了.通过 ...
- 在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验
准备工作 本篇文章采用Mono+CentOS+Jexus的方式实现部署.Net的Web应用程序(实战,上线项目). 不懂Mono的请移步张善友大神的:国内 Mono 相关文章汇总 不懂Jexus为何物 ...
- 子类继承父类时JVM报出Error:Implicit super constructor People() is undefined for default constructor. Must define an explicit constructor
当子类继承父类的时候,若父类没有定义带参的构造方法,则子类可以继承父类的默认构造方法 当父类中定义了带参的构造方法,子类必须显式的调用父类的构造方法 若此时,子类还想调用父类的默认构造方法,必须在父类 ...
- Android MVP+Retrofit+RxJava实践小结
关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...