博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AspNetCore 使用log4net+IExceptionFilter 记录错误日志
阅读量:7114 次
发布时间:2019-06-28

本文共 3165 字,大约阅读时间需要 10 分钟。

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

原来写过一个关于Nlog的日志框架,传送门为: 

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

1.创建log4net.config

2.配置Startup.

3.定义HttpGlobalExceptionFilter

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

 

 

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

public static ILoggerRepository repository { get; set; }public Startup(IConfiguration configuration){    Configuration = configuration;    //加载log4net日志配置文件    repository = LogManager.CreateRepository("NETCoreRepository");    XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));}public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){    services.AddMvc(options =>    {        options.Filters.Add
(); //加入全局异常类 });}  

控制器方面:

 

public class IndexController : Controller    {        private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(HttpGlobalExceptionFilter));        public IActionResult Index()        {            log.Error("哎哟我去");            return View();        }    }

 

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

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

 

public IActionResult Index()        {       try{}         catch{        ..        }                return View();        }

 

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

 

public class HttpGlobalExceptionFilter : IExceptionFilter    {        private ILog log = LogManager.GetLogger(Startup.repository.Name,typeof(HttpGlobalExceptionFilter));        ///         /// 当系统发生未捕捉的异常时就会触发这个方法        ///         /// context是上下文,包含了错误异常信息        public void OnException(ExceptionContext context)        {            log.Error("哎呀呀我是菜鸡");        }    }

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

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

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

public void ConfigureServices(IServiceCollection services)        {             ....///               services.AddMvc(options =>            {                options.Filters.Add
();//全局异常类 }); }

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

 

转载于:https://www.cnblogs.com/ZaraNet/p/10033153.html

你可能感兴趣的文章
kindeditor编辑器图片水印
查看>>
oracle数据库获取指定表的列的相关信息
查看>>
维克里拍卖 Vickrey auction
查看>>
数学百家
查看>>
Vue.js——60分钟webpack项目模板快速入门
查看>>
nginx实现单服务代理多域名
查看>>
解压缩
查看>>
Docker镜像的获取与删除
查看>>
iOS - UIPasteboard
查看>>
Vrrp协议
查看>>
项目中js调用service和procedure的办法
查看>>
用友UAP
查看>>
Tomcat error: A child container failed during start
查看>>
jquery 时间戳和日期时间转化
查看>>
Codeforces Round #370 (Div. 2) C. Memory and De-Evolution 水题
查看>>
MySQL数据备份之mysqldump使用
查看>>
Oracle基础知识
查看>>
mysql中根据一个字段相同记录写递增序号,如序号结果,如何实现?
查看>>
sql STUFF用法
查看>>
fdisk 分区
查看>>