错误日志的好处我就不说了,大家都心里有数,那今天浩子就给大家说一说基本的错误日志吧这次通过log4net记录日志。

原来写过一个关于Nlog的日志框架,传送门为:https://www.cnblogs.com/ZaraNet/p/9957655.html

使用呢,直接nuget log4net吧,这个就不多说了,那我们看一下如何使用。

1.创建log4net.config

2.配置Startup.

3.定义HttpGlobalExceptionFilter

在根目录创建log4net.config,其定义如下:

  1. <?xml version="1.0"?>
  2. <configuration>
  3. <configSections>
  4. <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=1B44E1D426115821" />
  5. </configSections>
  6. <log4net>
  7. <root>
  8. <!--<level value="DEBUG"/>-->
  9. <level value="ERROR"/>
  10. <!--根据log级别记录到不同的日志文件-->
  11. <!--<appender-ref ref="DebugLog" />-->
  12. <appender-ref ref="ErrorLog" />
  13. </root>
  14. <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
  15. <!-- 最后放开注释-->
  16. <span style="font-family: Arial, Helvetica, sans-serif;">
  17. <!--<lockingModel type="命名空间.MinimalLockDeleteEmpty" />-->
  18. </span>
  19. <param name="File" value="Log\" />
  20. <param name="AppendToFile" value="true" />
  21. <param name="RollingStyle" value="Date" />
  22. <param name="DatePattern" value="yyyy-MM\\yyyy-MM-dd.'log'" />
  23. <param name="StaticLogFileName" value="false" />
  24. <layout type="log4net.Layout.PatternLayout">
  25. <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
  26. </layout>
  27. <securityContext type="log4net.Util.WindowsSecurityContext">
  28. <credentials value="Process" />
  29. </securityContext>
  30. <filter type="log4net.Filter.LevelRangeFilter">
  31. <levelMin value="ERROR" />
  32. <levelMax value="ERROR" />
  33. </filter>
  34. </appender>
  35. </log4net>
  36. </configuration>

  在Startup.cs定义如下,记得引用相应的命名空间。

  1. public static ILoggerRepository repository { get; set; }
  2.  
  3. public Startup(IConfiguration configuration)
  4. {
  5. Configuration = configuration;
  6.  
  7. //加载log4net日志配置文件
  8. repository = LogManager.CreateRepository("NETCoreRepository");
  9. XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
  10. }
  11.  
  12. public IConfiguration Configuration { get; }
  13.  
  14. // This method gets called by the runtime. Use this method to add services to the container.
  15. public void ConfigureServices(IServiceCollection services)
  16. {
  17.  
  18. services.AddMvc(options =>
  19. {
  20. options.Filters.Add<Models.HttpGlobalExceptionFilter>(); //加入全局异常类
  21. });
  22. }  

控制器方面:

  1. public class IndexController : Controller
  2. {
  3. private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(HttpGlobalExceptionFilter));
  4. public IActionResult Index()
  5. {
  6. log.Error("哎哟我去");
  7. return View();
  8. }
  9. }

那我们可以看到呢,我们的日志已经生成好了,但是有经验的人都应该知道,这个如果你不记录错误的话,你也是每天创建一个这样的文件,那么我们应该怎么办呢?看了一下国内的网站,还没有对这个有针对性的解决方案,但我们可以最low的定义一个计时器,来找到为空的日志文件,如果它是为空的我们就删除它。

你可以自己搞个任务调度的框架去完成这个需求,当然在这里我还是非常推荐使用Quertz的。你自己去看一下它是不是0kb就完事了,Quertz文章传送门:https://www.cnblogs.com/ZaraNet/p/9962786.html.

  1. public IActionResult Index()
  2. {
  3. try{}
  4. catch{
  5. ..
  6. }
  7. return View();
  8. }

  回归正题,我们想一想,在一般的控制器中,每次进行逻辑业务的时候,都需要try,catch吗? 我们可以这样耦合度就太大了,所以我们最好通过全局filter。

  1. public class HttpGlobalExceptionFilter : IExceptionFilter
  2. {
  3. private ILog log = LogManager.GetLogger(Startup.repository.Name,typeof(HttpGlobalExceptionFilter));
  4. /// <summary>
  5. /// 当系统发生未捕捉的异常时就会触发这个方法
  6. /// </summary>
  7. /// <param name="context">context是上下文,包含了错误异常信息</param>
  8. public void OnException(ExceptionContext context)
  9. {
  10. log.Error("哎呀呀我是菜鸡");
  11. }
  12. }

你还可以自己定义记录格式:

  1. public static void ErrorLog(string throwMsg, Exception ex)
  2. {
  3. string errorMsg = string.Format("【抛出信息】:{0} <br>【异常类型】:{1} <br>【异常信息】:{2} <br>【堆栈调用】:{3}", new object[] { throwMsg,
  4. ex.GetType().Name, ex.Message, ex.StackTrace });
  5. errorMsg = errorMsg.Replace("\r\n", "<br>");
  6. errorMsg = errorMsg.Replace("位置", "<strong style=\"color:red\">位置</strong>");
  7. logerror.Error(errorMsg);
  8. }

  继承IExceptionFilter接口,在你程序报错的时候就会走到这里,所以你可以在这里完成一些操作去配合日志框架,我们还需要去注册服务

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. ....///
  4. services.AddMvc(options =>
  5. {
  6. options.Filters.Add<Filter.HttpGlobalExceptionFilter>();//全局异常类
  7. });
  8. }

  之后你就直接在OnException中直接进行写入就好了。今天就说到这里吧。嘿嘿!!

AspNetCore 使用log4net+IExceptionFilter 记录错误日志的更多相关文章

  1. 点滴积累【C#】---使用log4net组件记录错误日志(以文本形式记录)

    效果: 描述: 利用log4net组件进行错误日志的记录,log4net记录错误的方式我所了解的有4种,No.1 文本形式记录日志,No.2存储到数据库形式记录日志,No.3控制台控制显示日志,No. ...

  2. WebForm应用log4net记录错误日志——使用线程列队写入

    我的项目结构如下图: 日志帮助类库需要log4net包:工具—NuGet包管理器—管理解决方案NuGet程序包 线程日志帮助类 FlashLogger.cs 代码 using System; usin ...

  3. ASP.NET MVC中Log4Net记录错误日志的使用

    第一.在管理NuGet程序包 =>下载 Log4Net 第二.在web.config配置Log4Net 1:在<configuration>节点下 <configSection ...

  4. MVC4.0 利用HandleErrorAttribute和log4net实现记录异常日志功能

    1.MVC4.0中HandleErrorAttribte已经帮我们处理了异常问题,当我们新建一个非空的MVC项目时候,在FilterConfig中会发现这样的代码 public class Filte ...

  5. ASP.NET记录错误日志的方式

    程序记录错误日志是一种看起来对一般用户没什么作用,但对程序开发者用处很大的东西,它能查出错误或异常的程序马迹.那么,常用的记录错误日志的方式有哪些呢? 大多数情况下使用的是 1.直接记录为txt/xm ...

  6. asp.net mvc中加入log4net记录错误日志

    直接上代码示例:https://share.weiyun.com/aff36f2547514cfefe129ebb8ccb28ef 首先添加加log4net的dll,推荐用nuget.... 贴上配置 ...

  7. ASP.NET - 记录错误日志

    不需要像log4net/Nlog/Common Logging配置,简单好用. 不用增加声明logger对象,可记录当前执行状况. 可以定义 维护功能模板的开发人员,以便用功能模块对于开发人员. 出处 ...

  8. C# 记录错误日志

    程序的错误日志如何记录下来? 可以在遇到异常时,Catch异常,然后把异常的信息输出到txt文件中即可 /// <summary> /// 错误日志 /// </summary> ...

  9. ASP.NET 配置log4net启用写错误日志功能

    http://www.cnblogs.com/yeminglong/archive/2013/05/21/3091192.html 首先我们到apche的官网下载log4net的项目编译得到log4n ...

随机推荐

  1. numpy学习总结(重点讲解索引方式)

    numpy思维导图 ndarray对象是什么 NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对 ...

  2. Vue+localstrong登录注册,并保持登录状态

    在router.js中添加meta区分 比如登录注册页面,不需要登录即可进入,那么我们把meta中的isLogin标志设置为false { //登录 path: '/login', component ...

  3. python3.X中try/except

    包含try...except...在3.x版本中与2.x版本中的用法差异. 1.先说差异: 在2.x的python中用法实例: try: ...... except Exception,e: rais ...

  4. python 基础知识整理

    列表推导式 类似 data=[x+1 for x in range(10)]执行结果就是 [1,2,3,4,5,6,7,8,9,10] 还有 even_numbers=[x for x in rang ...

  5. 小白的学习之路(hello wold!)

    Hello word ! 一直想写博客,但是都拖延了,正好两天有假期就开始弄这个事情了.开始觉得写博客也没有什么,一路学习以来都是看别人的博客进行学习,也收藏了不少博客,学到了不少东西,所以我觉的博客 ...

  6. [Tips] Git使用经验

    brach 查看目前branch git branch 显示结果: * master *表示这是当前的branch. 建立分支 git branch 分支名 删除分支 git branch -d 分支 ...

  7. [C++一本通-图论算法] 例4-4 最小花费

    题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元. 输入输 ...

  8. BZOJ 4455

    树的点到图的点是双射 枚举哪些点可以映射到 然后dp容斥 复杂度 $2^n*n^3$ #include<bits/stdc++.h> using namespace std; #defin ...

  9. MT7688交叉编译环境配置

    在ubuntu下设置MT7688交叉编译环境,用于编译mt7688下使用的程序 1.首先在vmware下安装ubuntu64位,由于交叉编译工具需要64位系统,此次安装的是ubuntu14 2.在ub ...

  10. Python(day1)

    一.Python的属于解释型语言. 编译型:一次性,将全部的程序编译成二进制文件,然后再运行. 优点:运行速度快. 缺点:开发效率低,不能跨平台. 解释型:当你的程序运行时,一行一行的解释,并运行. ...