asp.net core自定义异常过滤器并记录到Log4Net日志

news/2024/11/20 11:51:07/

1.创建异常过滤器特性

using Log4Net.Controllers;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;namespace Log4NetTest
{public class CustomerExceptionFilterAttribute : Attribute, IExceptionFilter{private readonly ILogger<CustomerExceptionFilterAttribute> _logger;public CustomerExceptionFilterAttribute(ILogger<CustomerExceptionFilterAttribute> logger){_logger = logger;}//当发生异常时,执行方法public void OnException(ExceptionContext context){//可以把错误信息写道日志里面_logger.LogError(context.Exception.Message);context.Result = new JsonResult(new{Success = false,Msg = context.Exception.Message,Position = context.Exception.StackTrace,Data = context.RouteData.Values});}}
}

2.使用异常特性
模拟一个报错,除数不为0

  /// <summary>/// 退出/// </summary>[HttpGet][TypeFilter(typeof(CustomerExceptionFilterAttribute))]public async Task<IActionResult> Test(){int i = 0;int j = 1 / i;//return Ok();}

TypeFilter:是把CustomerExceptionFilterAttribute注入到服务,
ServiceFilter:这里也可以使用ServiceFilter,然后在program中注入 builder.Services.AddScoped();
也可以全局注入,就不需要在控制器或方法上使用特性了

 builder.Services.AddControllers(options =>{//全局options.Filters.Add<CustomerExceptionFilterAttribute>(); // 注册自定义异常过滤器});

执行后会返回下面的效果
在这里插入图片描述
3.配置Log4Net日志
3.1安装Nuget包

<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="6.1.0" />
<PackageReference Include="log4net" Version="2.0.14" />

3.2创建log4Net的config配置文件

<?xml version="1.0" encoding="utf-8"?>
<log4net><!-- Define some output appenders --><appender name="rollingAppender" type="log4net.Appender.RollingFileAppender"><!--    value="logs/log.log"--><file value="logs/" /><!--追加日志内容--><appendToFile value="true" /><!--防止多线程时不能写Log,官方说线程非安全--><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><!--可以为:Once|Size|Date|Composite--><!--Composite为Size和Date的组合--><rollingStyle value="Composite" /><!--当备份文件时,为文件名加的后缀--><datePattern value="yyyyMMdd/'log.log'" /><!--日志最大个数,都是最新的--><!--rollingStyle节点为Size时,只能有value个日志--><!--rollingStyle节点为Composite时,每天有value个日志--><maxSizeRollBackups value="20" /><!--可用的单位:KB|MB|GB--><maximumFileSize value="3MB" /><!--置为true,当前最新日志文件名永远为file节中的名字--><staticLogFileName value="false" /><!--输出级别在INFO和ERROR之间的日志--><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="ALL" /><param name="LevelMax" value="FATAL" /></filter><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout></appender><!-- error日志 --><appender name="errorAppender" type="log4net.Appender.RollingFileAppender"><file value="logs/" /><appendToFile value="true" /><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><rollingStyle value="Composite" /><datePattern value="yyyyMMdd/'error.log'" /><maxSizeRollBackups value="20" /><maximumFileSize value="3MB" /><staticLogFileName value="false" /><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="ERROR" /><param name="LevelMax" value="ERROR" /></filter><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout></appender><!--SqlServer形式--><!--log4net日志配置:http://logging.apache.org/log4net/release/config-examples.html --><appender name="mysqlAppender" type="log4net.Appender.AdoNetAppender"><!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库--><bufferSize value="0" /><connectionType value="System.Data.SqlClient.SqlConnection,System.Data" /><!--日志数据库连接串--><connectionString value="server=.;database=zhaoxi;uid=sa;pwd=peng@123" /><commandText value="INSERT INTO logs(app_name,log_date, thread, level, logger, message,exception)VALUES(@app_name,@log_date, @thread,@log_level, @logger, @message, @exception);" /><parameter><parameterName value="@app_name" /><dbType value="String" /><size value="100" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="api" /></layout></parameter><parameter><parameterName value="@log_date" /><dbType value="DateTime" /><layout type="log4net.Layout.RawTimeStampLayout" /></parameter><parameter><parameterName value="@thread" /><dbType value="String" /><size value="100" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%thread" /></layout></parameter><parameter><parameterName value="@log_level" /><dbType value="String" /><size value="50" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%level" /></layout></parameter><parameter><parameterName value="@logger" /><dbType value="String" /><size value="255" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%logger" /></layout></parameter><parameter><parameterName value="@message" /><dbType value="String" /><size value="1000" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%message" /></layout></parameter><parameter><parameterName value="@exception" /><dbType value="String" /><size value="2000" /><layout type="log4net.Layout.ExceptionLayout" /></parameter></appender><root><!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--><!--OFF:0--><!--FATAL:FATAL--><!--ERROR: ERROR,FATAL--><!--WARN: WARN,ERROR,FATAL--><!--INFO: INFO,WARN,ERROR,FATAL--><!--DEBUG: INFO,WARN,ERROR,FATAL--><!--ALL: DEBUG,INFO,WARN,ERROR,FATAL--><priority value="ALL" /><level value="INFO" /><!--使用上面配置的那个规则,ref指定上面的规则名称--><appender-ref ref="rollingAppender" /><appender-ref ref="errorAppender" /><appender-ref ref="mysqlAppender" /></root>
</log4net>

3.2注入日志服务

  builder.Logging.AddLog4Net("Configs/log4net.Config");

这样就把日志写到了error.log.txt文件里了
补充:log4Net是对asp.net core 自带的日志系统的包装,已完成更多的日志功能,这边也可以写入到数据库等,也可以接入serilog结构化日志,可以更好的完成日志分析


http://www.ppmy.cn/news/1211507.html

相关文章

一文了解游戏行业(数据分析)

一.概况 1.基本术语 游戏行业基础术语——持续更新ing... 2.产业链 包括游戏开发&#xff0c;发行和销售等环节 游戏开发&#xff1a;上游环节&#xff1b;是游戏产业链的核心环节&#xff0c;包括游戏策划&#xff0c;美术设计&#xff0c;程序开发等&#xff0c;是决定游…

AUTOSAR汽车电子嵌入式编程精讲300篇-智能阀CAN总线延时边界确定(续)

目录 3.2 单路智能阀系统延时边界确定 3.3 单路智能阀系统CAN通信延时边界仿真分析

牛客---坐标移动

开发一个坐标计算工具&#xff0c; A表示向左移动&#xff0c;D表示向右移动&#xff0c;W表示向上移动&#xff0c;S表示向下移动。从&#xff08;0,0&#xff09;点开始移动&#xff0c;从输入字符串里面读取一些坐标&#xff0c;并将最终输入结果输出到输出文件里面。 输入…

k8s 裸金属集群部署metalLB软负载均衡 —— 筑梦之路

metalLB 官方网站 Repo&#xff1a;https://github.com/metallb/metallb 官网&#xff1a;https://metallb.universe.tf/installation metalLB解决什么问题&#xff1f; MetalLB 是一个用于裸机 Kubernetes 集群的负载均衡器实现&#xff0c;使用标准路由协议。 k8s 并没有为裸…

Java核心知识点之常量

在Java中&#xff0c;常量是一种特殊的变量&#xff0c;其值在程序执行期间不会改变。Java提供了几种类型的常量&#xff0c;包括字面值常量、符号常量、枚举常量等。 1. 字面值常量 字面值常量是在程序中直接使用的实际值&#xff0c;例如&#xff1a; int a 10; // 整型字…

01_ddim_inversion_CN

DDIM反转 设置 # !pip install -q transformers diffusers accelerateimport torch import requests import torch.nn as nn import torch.nn.functional as F from PIL import Image from io import BytesIO from tqdm.auto import tqdm from matplotlib import pyplot as p…

dcat admin 各种问题

样式问题 如何根据条件给表格数据栏添加背景色 use Illuminate\Support\Collection;protected function grid(){return Grid::make(new BookArticle(), function (Grid $grid) {... 其他代码// Collection的完整路径&#xff1a;Illuminate\Support\Collection;$grid->row…

SpringBoot--中间件技术-2:整合redis,redis实战小案例,springboot cache,cache简化redis的实现,含代码

SpringBoot整合Redis 实现步骤 导pom文件坐标 <!--redis依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>yaml主配置文件&#xff0c;配置…