程序地带

asp.net core使用 log4net全局日志处理


一、引用类库:


  1、 Microsoft.Extensions.Logging.Log4Net.AspNetCore


  2、log4net.AspNetCore


二、配置 log4net.config 文件


<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="DebugAppender" type="log4net.Appender.DebugAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<!--指定日记记录方式,以滚动文件的方式(文件记录)-->
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<!--日志路径-->
<file value="loglog.txt" />
<!--是否是向文件中追加日志-->
<appendToFile value="true" />
<!--log保留天数-->
<param name= "MaxSizeRollBackups" value= "10"/>
<!--每个文件最大3M-->
<param name="maximumFileSize" value="3MB" />
<!--日志根据日期滚动-->
<param name="RollingStyle" value="Date" />
<!--日志文件名格式为:logs_20080831.log-->
<param name="DatePattern" value=""logs_"yyyyMMdd".log"" />
<!--日志文件名是否是固定不变的-->
<param name="StaticLogFileName" value="false" />
<!--布局-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception" />
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="DebugAppender" />
<appender-ref ref="RollingFile" />
</root>
</log4net>

三、创建自己的 MyExceptionFilterAttribute并继承 ExceptionFilterAttribute 该抽象类,依赖注入日志对象 logger


public class MyExceptionFilterAttribute : ExceptionFilterAttribute
{
private readonly ILogger<MyExceptionFilterAttribute> _logger;
/// <summary>
/// 通过构造函数的方式,依赖注入日志对象
/// </summary>
/// <param name="logger"></param>
public MyExceptionFilterAttribute(ILogger<MyExceptionFilterAttribute> logger)
{
this._logger = logger;
}
public override void OnException(ExceptionContext context)
{
// 判断是否被处理过
if (!context.ExceptionHandled)
{
context.ExceptionHandled = true;
var str = $"异常:{context.HttpContext.Request.Path}{context.Exception.Message}";
// 输出到控制台
Console.WriteLine(str);
// 写入文本日志(或者是记录到数据库等....)
_logger.LogWarning(str);
if (context.HttpContext.Request.Method == "GET")
{
// 如果是 get请求,则跳转页面
}
else
{
// 如果是post 则都是ajax请求,则返回json数据格式,输出自定义或者约定好的格式
context.Result = new JsonResult(new { Result = false, Message = "请求出现错误,请联系管理员" });
}
}
}
}

四、在Program.cs配置使用log4net


public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging((context, loggingBuilder) =>
{
loggingBuilder.AddFilter("System", LogLevel.Warning);
loggingBuilder.AddFilter("Microsoft", LogLevel.Warning);
// 使用log4net
loggingBuilder.AddLog4Net();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}

五、在Startup.cs ConfigureServices方法里面注册全局Filters错误日志处理


// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(options=>
{
// 全局注册,全局生效
options.Filters.Add(typeof(MyExceptionFilterAttribute));
});
}

这样系统都可以统一处理异常。避免代码中到处都是try catch,开发人员多,写出来的日志格式等不统一,错误日志漏处理等现象。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/changsen-wang/archive/2021/01/13/14275037.html

随机推荐

python定义可变参数_python可变参数定义

python中函数的参数可不可以在可变参数后面加一般参数定义函数的参数时,用IDataParameter[]和SqlParameter[]时没有区别,作用是一样的。IDat...

weixin_39775910 阅读(233)

python 角点检测_【python-opencv】30-角点检测

【微语】世上有很多不可能,不过不要在你未尽全力之前下结论特征检测:找到图像特征的技术特征描述:描述图像特征Harris角点检测(CornerDetection...

weixin_39669638 阅读(603)

DMCTF校赛思路总结

DMCTF校赛思路总结针对于校赛的一些题目的思路进行汇总。WEB题:Weak_type:​我首先是百度了一下,题中涉及到的isset(ÿ...

烦躁的程序员 阅读(864)