在客户端请求接口时,经常会出现接口相应慢,接口等待超时,接口错误,为了这事相信不少后台开发者为此背锅,记下请求日志,拿出有力证据这才是关键。

1.接口请求错误记录

很多时候接口请求出现的500,404这些错误,请求当时出现如果客户端没有日志记录,有些问题是很难复现,虽然系统日志中也会记录,但是不够系统。

那么可以通过接下来的方式记录系统错误信息,这时我们可以在Global中添加Application_Error的处理:

  1. void Application_Error(object sender, EventArgs e)
  2. {
  3. //获取错误信息
  4. Exception lastError = Server.GetLastError();
  5. int httpCode = ;
  6. HttpException httpError = lastError as HttpException;
  7. if (httpError != null)
  8. {
  9. //获取错误代码
  10. httpCode = httpError.GetHttpCode();
  11. }
  12. // 在出现未处理的错误时运行的代码
  13. Exception objErr = Server.GetLastError().GetBaseException();
  14. string error = string.Empty;
  15. string errortime = string.Empty;
  16. string erroraddr = string.Empty;
  17. string errorinfo = string.Empty;
  18. string errorsource = string.Empty;
  19. string errortrace = string.Empty;
  20. string errorcode = string.Empty;
  21.  
  22. error += "发生时间:" + System.DateTime.Now.ToString() + "<br>";
  23. errortime = "发生时间:" + System.DateTime.Now.ToString();
  24.  
  25. error += "发生异常页: " + Request.Url.ToString() + "<br>";
  26. erroraddr = "发生异常页: " + Request.Url.ToString();
  27.  
  28. error += "返回状态码: " + httpCode + "<br>";
  29. errorcode = "返回状态码: " + httpCode;
  30.  
  31. error += "异常信息: " + objErr.Message + "<br>";
  32. errorinfo = "异常信息: " + objErr.Message;
  33. //error +="错误源:"+objErr.Source+"<br>";
  34. //error += "堆栈信息:" + objErr.StackTrace + "<br>";
  35. errorsource = "错误源:" + objErr.Source;
  36. errortrace = "堆栈信息:" + objErr.StackTrace;
  37. error += "--------------------------------------<br>";
  38. Server.ClearError();
  39. Application["error"] = error;
  40. //独占方式,因为文件只能由一个进程写入.
  41. System.IO.StreamWriter writer = null;
  42. try
  43. {
  44. lock (this)
  45. {
  46. // 写入日志
  47. string year = DateTime.Now.Year.ToString();
  48. string month = DateTime.Now.Month.ToString();
  49. string path = string.Empty;
  50. string filename = DateTime.Now.Day.ToString() + ".txt";
  51. path = Server.MapPath("~/App_Data/log/") + year + "/" + month;
  52. //如果目录不存在则创建
  53. if (!System.IO.Directory.Exists(path))
  54. {
  55. System.IO.Directory.CreateDirectory(path);
  56. }
  57. System.IO.FileInfo file = new System.IO.FileInfo(path + "/" + filename);
  58. //if (!file.Exists)
  59. // file.Create();
  60. //file.Open(System.IO.FileMode.Append);
  61. writer = new System.IO.StreamWriter(file.FullName, true);//文件不存在就创建,true表示追加
  62. writer.WriteLine("用户IP:" + Request.UserHostAddress);
  63. // if (Session["Identity"] != null)
  64. // {
  65. // writer.WriteLine("登录帐号:" System.Web.HttpContext.Current.Session["Identity"]).YongHuInfo.ACCOUNTID);
  66. // }
  67. writer.WriteLine(errortime);
  68. writer.WriteLine(erroraddr);
  69. writer.WriteLine(errorcode);
  70. writer.WriteLine(errorinfo);
  71. writer.WriteLine(errorsource);
  72. writer.WriteLine(errortrace);
  73. writer.WriteLine("--------------------------------------------------------------------------------------");
  74. }
  75. }
  76. finally
  77. {
  78. if (writer != null)
  79. writer.Close();
  80. }
  81. //服务端返回状态码
  82. Response.StatusCode = ;
  83. Response.AddHeader("errormsg", Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(objErr.Message)));
  84. }

2.接口请求记录

记录每一次请求接口的时间和参数,方便请求错误重现。

在Application_BeginRequest添加如下配置:

  1. void Application_BeginRequest(object source, EventArgs e)
  2. {
  3.  
  4. var requestUrl = DateTime.Now + "请求链接" + Request.Url.ToString() + "\r\n";
  5. var requestData = DateTime.Now + "请求参数" + ApiSign.GetxtParams() + "\r\n";
  6. // 写入日志
  7. string year = DateTime.Now.Year.ToString();
  8. string month = DateTime.Now.Month.ToString();
  9. string path = string.Empty;
  10. string filename = DateTime.Now.Day.ToString() + "_request" + ".txt";
  11. path = Server.MapPath("~/App_Data/log/") + year + "/" + month;
  12. string Filepath=path + "/" + filename;
  13.  
  14. if (requestUrl.ToUpper().IndexOf("API/") != -)
  15. {
  16. Task.Run(() =>{Ecio_Admin.Common.ToolKit.PrintText(requestUrl + requestData, Filepath, true);});
  17. }
  18. }

当然这里有一个比较常用的日志文件记录方法,这里把单独封装了PrintText。

  1. /// <summary>
  2. /// 本地打印文本记录
  3. /// </summary>
  4. /// <param name="text">需要写入的值</param>
  5. /// <param name="path">文件路径</param>
  6. /// <param name="IsAppend">是否追加至最后一行</param>
  7. /// <returns>追加结果</returns>
  8. public static void PrintText(string text, string path, bool IsAppend)
  9. {
  10. try
  11. {
  12. if (!Directory.Exists(path.Split(new string[] { path.Substring(path.LastIndexOf('\\')) }, StringSplitOptions.RemoveEmptyEntries)[]))
  13. Directory.CreateDirectory(path);
  14. if (!File.Exists(path))
  15. {
  16. using (System.IO.StreamWriter Creat = File.CreateText(path)) { }
  17. }
  18. if (IsAppend)
  19. {
  20.  
  21. using (System.IO.StreamWriter sw = new System.IO.StreamWriter(path, true))
  22. {
  23. lock (sw)
  24. {
  25. sw.WriteLine(text);
  26. }
  27. }
  28. }
  29. else
  30. {
  31. System.IO.File.WriteAllText(path, text);
  32. }
  33. }
  34. catch { }
  35. }

3.记录接口请求时间

这里我是用了一个windows系统服务来轮询每一个接口的请求和响应时间,可以参考下面这个文章,建一个服务,然后测试接口响应时间。

http://www.cnblogs.com/loyung/p/6123317.html

Global配置接口访问日志以及测试日志记录的更多相关文章

  1. Spring Boot从入门到实战:集成AOPLog来记录接口访问日志

    日志是一个Web项目中必不可少的部分,借助它我们可以做许多事情,比如问题排查.访问统计.监控告警等.一般通过引入slf4j的一些实现框架来做日志功能,如log4j,logback,log4j2,其性能 ...

  2. SpringBoot应用中使用AOP记录接口访问日志

    SpringBoot应用中使用AOP记录接口访问日志 本文主要讲述AOP在mall项目中的应用,通过在controller层建一个切面来实现接口访问的统一日志记录. AOP AOP为Aspect Or ...

  3. Spring Boot 2 配置服务器访问日志

    Tomcat控制台中看到的日志是服务器的日志,而服务器访问日志则是记录服务处理的请求信息. 开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1.8 1.新建一个名 ...

  4. 循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

    在一个系统的权限管理模块中,一般都需要跟踪一些具体的日志,ABP框架的系统的日志管理,包括登录日志.接口访问日志.实体变化历史日志,本篇随笔介绍ABP框架中这些日志的管理和界面处理. 1.系统登录日志 ...

  5. Apache配置 5.访问日志不记录静态文件

    介绍:项目中的CSS.图片.js都是静态文件.一般会将静态文件放到一个单独的目录中,以方便管理. 1. 配置 # vim /usr/local/apache2.4/conf/extra/httpd-v ...

  6. SpringBoot 使用AOP记录接口访问日志

    文章来源:https://macrozheng.github.io/mall-learning/#/technology/aop_log AOP AOP为Aspect Oriented Program ...

  7. 通过Nginx,Tomcat访问日志(access log)记录请求耗时

    一.Nginx通过$upstream_response_time $request_time统计请求和后台服务响应时间 nginx.conf使用配置方式: log_format main '$remo ...

  8. Nginx 笔记与总结(4)配置 server 访问日志

    打开 nginx.conf: [root@localhost ~]# cd /usr/local/nginx/conf [root@localhost conf]# vim nginx.conf 在默 ...

  9. Centos下Nginx配置WEB访问日志并结合shell脚本定时切割

    在一个成熟的WEB系统里,没有日志管理是不可以的,有了日志,可以帮助你得到用户地域来源.跳转来源.使用终端.某个URL访问量等相关信息:通过错误日志,你可以得到系统某个服务或server的性能瓶颈等. ...

随机推荐

  1. 完整的AJAX

    $.ajax({url:"请求路径",data:{"key":前端传入后台处理的数据},type:"post", //请求方式dataTyp ...

  2. 云计算SPI(SaaS、PaaS、IaaS)

    云计算SPI(SaaS.PaaS.IaaS) The other day, I arrived at the SAP LABS CHINA for interview with my pleasure ...

  3. django-dailyfresh

    Hold on ,learn by myself! redis nosql - 不支持sql语法 - 存储数据都是KV形式 - Mongodb - Redis - Hbase hadoop - Cas ...

  4. Linux系统修改Home下的目录为英文

    修改Home下的目录为英文 修改目录映射文件名: vim .config/user-dirs.dirs 修改如下:XDG_DESKTOP_DIR="$HOME/Desktop"XD ...

  5. 实验吧—隐写术——WP之 男神一般都很低调很低调的!!

    首先我们打开解题连接~ 是直接给我们下载了一个压缩文件,解压后得到: 确实是很帅的小哥哥呢,呵呵...... 分析题目提示,“获取隐藏在图片中的flag”,嗯~这句很重要,他决定了我们要先用那种工具 ...

  6. JavaScript 缓存基本原理

    // 这是个闭包函数,接收一个函数,可以把接收的函数转换成具有缓存能力的函数 var memoize = function(f) { // 使用一个 cache 对象来进行缓存 var cache = ...

  7. java构造代码块详解

    一.简介 首先说一下,Java中有哪些代码块. 普通代码块 就是在方法后面使用"{}"括起来的代码片段,不能单独执行,必须调下其方法名才可以执行. 静态代码块 在类中使用stati ...

  8. Vue.js系列之项目搭建

    项目搭建具体步骤如下: 1.安装node (中)https://nodejs.org/zh-cn/ (英)https://nodejs.org/en/ 2.安装cnpm镜像 (node自带安装了npm ...

  9. Unity3D的主要类图 N年前的版本

    1. GameObject_Structure 2. Component_Design 3. Behaviour_Design 4. Animation_Design

  10. c# 线程同步各类锁

    1)原子操作(Interlocked):所有方法都是执行一次原子读取或一次写入操作. 2)lock()语句:避免锁定public类型,否则实例将超出代码控制的范围,定义private对象来锁定. 3) ...