做开发的都知道,完整的日志记录对问题的解决,回溯是多么的重要,多么的不可缺少。
那么我们怎么记录完整的日志?
今天,我们来说一说问题:从哪里开始记录呢?在哪里保存呢?
IHttpModule,这个大家用到过没有?,我想绝大部分同学都用到过的,
不了解的看看wolfy 同学的 https://www.cnblogs.com/wolf-sun/p/4338970.html 主要是看看IHttpModule在请求处理过程中的执行位置,以及BeginRequest ReleaseRequestState的执行时间点;
IHttpModule里面有一个Init方法,需要我们写几行代码
public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(OnBeginRequest); context.ReleaseRequestState += new EventHandler(OnReleaseRequestState); context.Error += new EventHandler(OnError); }
context.BeginRequest:请求开始第一个触发事件
context.ReleaseRequestState:请求结束前的最后一个触发事件,这个事件里面可以访问到httpcontext
context.Error:发生系统错误时触发,如403,404
搞明白前面几个时间的触发点,接下来就是声明一个日志对象了
public void OnBeginRequest(Object source, EventArgs e) { var logItem = new Log() { //请求完整的url ActionUrl = HttpContext.Current.Request.RawUrl, //请求id RequestID= SessionManager.RequestID, //客户端IP ClientIP = HttpContext.Current.Request.UserHostAddress, //日志主体对象 LogData = new StringBuilder(), }; HttpContext.Current.Items["Log"] = LogItem; }
日志对象就算是创建好了,哪里需要写日志,就可以往LogData里面写入数据
接下来就是吧日志保存下来了,我是把日志存到数据里面的,方便查询嘛
public void OnReleaseRequestState(Object source, EventArgs e) { var logitem = (Log)HttpContext.Current.Items["log"]; LogBiz.GetInstance().SaveLog(logitem); }
希望我的做法能够给你带来灵感