.Net6 Core Web API 配置 log4net + MySQL

目录

一、导入NuGet 包

二、添加配置文件  log4net.config 

三、创建MySQL表格

四、Program全局配置

五、帮助类编写

六、效果展示


小编没有使用依赖注入的方式。

一、导入NuGet 包

        ----  log4net        基础包   
        ----  Microsoft.Extensions.Logging.Log4Net.AspNetCore          扩展包
        ----  MySql.Data        数据库包

二、添加配置文件  log4net.config 

需改数据库的字符串

<?xml version="1.0" encoding="utf-8"?>
<configuration><configSections><!-- 读取<log4not>节点 --><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /></configSections><log4net><!--正常日志:::记录正常日志--><!-- appender 定义日志输出方式   将日志以回滚文件的形式写到MySQL数据库中。--><appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"><!-- 代表缓存大小,在没达到缓存大小时,暂时不会存到数据库中, --><!-- 当程序关闭之后,会将未插入的信息加入到数据库中 --><bufferSize value="1" /><!--引入《MySql.Data》包--><param name="ConnectionType" value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" /><!--配置连接数据库的字符串--><param name="ConnectionString" value="server=localhost;database=TTTTT;uid=root;pwd=123456;"/><!--配置MySQL的插入语句--><param name="CommandText" value="insert into log4net(log_datetime,log_thread,log_level,log_logger,log_message) values(@log_datetime, @log_thread , @log_level, @log_logger, @log_message)" /><param name="Parameter"><param name="ParameterName" value="@log_datetime" /><param name="DbType" value="DateTime" /><param name="Layout" type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d{yyyy'-'MM'-'dd HH':'mm':'ss}" /></param></param><param name="Parameter"><param name="ParameterName" value="@log_thread" /><param name="DbType" value="String" /><param name="Size" value="255" /><param name="Layout" type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%t" /></param></param><param name="Parameter"><param name="ParameterName" value="@log_level" /><param name="DbType" value="String" /><param name="Size" value="255" /><param name="Layout" type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%p" /></param></param><param name="Parameter"><param name="ParameterName" value="@log_logger" /><param name="DbType" value="String" /><param name="Size" value="255" /><param name="Layout" type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%c" /></param></param><param name="Parameter"><param name="ParameterName" value="@log_message" /><param name="DbType" value="String" /><param name="Size" value="4000" /><param name="Layout" type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%m" /></param></param></appender><!--正常日志:::记录正常日志--><!--按日期分割日志文件 一天一个--><!-- appender 定义日志输出方式   将日志以回滚文件的形式写到文件中。--><appender name="RollingFile" type="log4net.Appender.RollingFileAppender"><!--定义文件存放位置--><file value="Log\log_"/><!--是否追加到文件--><appendToFile value="true"/><!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModel type="log4net.Appender.FileAppender+MinimalLock"/><!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--><maxSizeRollBackups value="-1"/><!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--><rollingStyle value="Composite"/><datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/><!--是否只写到一个文件中--><staticLogFileName value="false"/><!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志--><maximumFileSize value="100MB"/><!--计数类型为1,2,3…--><!--<param name="CountDirection" value="1"/>--><layout type="log4net.Layout.PatternLayout"><!--输出格式-样例:记录时间:2022-08-24 17:59:31,172    线程ID:[4]    日志级别:INFO  当前类:Log4NetDemo.MainClass    行号:%L日志描述:创建连接失败。--><conversionPattern value="记录时间:%date    线程ID:[%thread]    日志级别:%-5level %n当前类:%logger		行号:%L  %n日志描述:%message%newline %n"/></layout></appender><!--错误日志:::记录错误日志--><!--按日期分割日志文件 一天一个--><!-- appender 定义日志输出方式   将日志以回滚文件的形式写到文件中。--><appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"><!--定义文件存放位置--><file value="Log\error_"/><!--是否追加到文件--><appendToFile value="true"/><!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModel type="log4net.Appender.FileAppender+MinimalLock"/><!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--><maxSizeRollBackups value="-1"/><!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--><rollingStyle value="Composite"/><datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/><!--是否只写到一个文件中--><staticLogFileName value="false"/><!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志--><maximumFileSize value="100MB"/><!-- layout 控制Appender的输出格式,也可以是xml  一个Appender只能是一个layout--><layout type="log4net.Layout.PatternLayout"><!--每条日志末尾的文字说明--><!--输出格式 模板--><!-- <param name="ConversionPattern"  value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger   操作者ID:%property{Operator} 操作类型:%property{Action}%n  当前机器名:%property%n当前机器名及登录用户:%username %n  记录位置:%location%n 消息描述:%property{Message}%n   异常:%exception%n 消息:%message%newline%n%n" />--><!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info--><!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n"/>--><conversionPattern value="%n==========%n【日志级别】%-5level%n【记录时间】%date%n【执行时间】[%r]毫秒%n【错误位置】%logger 属性[%property{NDC}]%n【错误描述】%message%n【错误详情】%newline"/></layout><filter type="log4net.Filter.LevelRangeFilter,log4net"><levelMin value="ERROR" /><levelMax value="FATAL" /></filter></appender><!--DEBUG:::记录DEBUG日志--><!--按日期分割日志文件 一天一个--><!-- appender 定义日志输出方式   将日志以回滚文件的形式写到文件中。--><appender name="DebugAppender" type="log4net.Appender.RollingFileAppender"><!--定义文件存放位置--><file value="Log\debug_"/><!--是否追加到文件--><appendToFile value="true"/><!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModel type="log4net.Appender.FileAppender+MinimalLock"/><!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--><maxSizeRollBackups value="-1"/><!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--><rollingStyle value="Composite"/><datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/><!--是否只写到一个文件中--><staticLogFileName value="false"/><!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志--><maximumFileSize value="100MB"/><!-- layout 控制Appender的输出格式,也可以是xml  一个Appender只能是一个layout--><layout type="log4net.Layout.PatternLayout"><!--每条日志末尾的文字说明--><!--输出格式 模板--><!-- <param name="ConversionPattern"  value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger   操作者ID:%property{Operator} 操作类型:%property{Action}%n  当前机器名:%property%n当前机器名及登录用户:%username %n  记录位置:%location%n 消息描述:%property{Message}%n   异常:%exception%n 消息:%message%newline%n%n" />--><!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info--><!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n"/>--><conversionPattern value="%n==========%n【日志级别】%-2level%n【记录时间】%date%n【执行时间】[%r]毫秒%n【debug位置】%logger 属性[%property{NDC}]%n【debug描述】%message"/></layout><filter type="log4net.Filter.LevelRangeFilter,log4net"><levelMin value="DEBUG" /><levelMax value="WARN" /></filter></appender><root><!--日志等级:OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL--><level value="ALL" /><appender-ref ref="ADONetAppender" /><appender-ref ref="RollingFile" /><appender-ref ref="ErrorAppender" /><appender-ref ref="DebugAppender" /></root></log4net></configuration>

三、创建MySQL表格

CREATE TABLE `log4net` (
`log_datetime` datetime DEFAULT NULL,
`log_thread` varchar(255) DEFAULT NULL,
`log_level` varchar(255) DEFAULT NULL,
`log_logger` varchar(255) DEFAULT NULL,
`log_message` varchar(4000) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

四、Program全局配置

// 全局配置 log4net
ILoggerRepository repository = LogManager.CreateRepository("LogRepository");
// 读取配置文件
XmlConfigurator.Configure(repository, new FileInfo("Log4/log4net.config"));
// log错误日志配置
builder.Services.AddControllers(options =>
{options.SuppressAsyncSuffixInActionNames = false;options.Filters.Add(typeof(GlobalExceptionsFilter));
});

五、帮助类编写

/// <summary>
/// 日志帮助实现类
/// </summary>
public class LoggerHelper<TClass>
{private static readonly ILog Log = LogManager.GetLogger("LogRepository", typeof(TClass));public static void Debug(string msg) => Log.Debug(msg);public static void Info(string msg) => Log.Info(msg);public static void Warn(string msg) => Log.Warn(msg);public static void Error(string msg) => Log.Error(msg);public static void Fatal(string msg) => Log.Fatal(msg);
}
/// <summary>
/// 全局异常错误日志
/// // log错误日志配置
/// builder.Services.AddControllers(options =>
/// {
///     options.SuppressAsyncSuffixInActionNames = false;
///     options.Filters.Add(typeof(GlobalExceptionsFilter));
/// });
/// </summary>
public class GlobalExceptionsFilter : IExceptionFilter
{private readonly IWebHostEnvironment _env;public GlobalExceptionsFilter(IWebHostEnvironment env){_env = env;}public void OnException(ExceptionContext context){var json = new JsonErrorResponse();json.Message = context.Exception.Message;//错误信息if (_env.IsDevelopment()){json.DevelopmentMessage = context.Exception.StackTrace;//堆栈信息}context.Result = new InternalServerErrorObjectResult(json);//采用log4net 进行错误日志记录LoggerHelper<Exception>.Error(WriteLog(json.Message, context.Exception));}/// <summary>/// 自定义返回格式/// </summary>/// <param name="throwMsg"></param>/// <param name="ex"></param>/// <returns></returns>public string WriteLog(string throwMsg, Exception ex){return string.Format("【自定义错误】:{0} \r\n" +"【异常类型】:{1} \r\n" +"【异常信息】:{2} \r\n" +"【堆栈调用】:{3}", new object[] { throwMsg,ex.GetType().Name, ex.Message, ex.StackTrace });}}public class InternalServerErrorObjectResult : ObjectResult
{public InternalServerErrorObjectResult(object value) : base(value){StatusCode = StatusCodes.Status500InternalServerError;}
}
//返回错误信息
public class JsonErrorResponse
{/// <summary>/// 生产环境的消息/// </summary>public string Message { get; set; }/// <summary>/// 开发环境的消息/// </summary>public string DevelopmentMessage { get; set; }
}

六、效果展示

/// <summary>
/// 测试代码
/// </summary>
[HttpGet]
public string Index()
{LoggerHelper<FirstController>.Info("WWWWWWW");LoggerHelper<Student>.Info("PPPP");throw new Exception("RRRRRRRR");return "OK";
}


\bin\Debug\net6.0\Log

如有错误,烦请批评指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/25733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8s集群安全机制

1.访问K8s集群的时候&#xff0c;需要经过三个步骤完成具体操作 &#xff08;1&#xff09;认证&#xff08;2&#xff09;鉴权&#xff08;授权&#xff09;&#xff08;3&#xff09;准入控制 进行访问的时候&#xff0c;过程中都要经过apiserver&#xff0c;apiserver做统…

Docker与DevOps的无敌组合,引爆你的创新潜能

&#x1f3c6;荣誉认证&#xff1a;51CTO博客专家博主、TOP红人、明日之星&#xff1b;阿里云开发者社区专家博主、技术博主、星级博主。 &#x1f4bb;微信公众号&#xff1a;iOS开发上架 &#x1f4cc;本文由iOS开发上架原创&#xff01; &#x1f389;欢迎关注&#x1f50e;…

【网络编程·传输层】UDP和TCP的报头

目录 一、端口号划分 二、部分指令 1、pidof&#xff08;用于查看进程id&#xff09; 2、netstat&#xff08;查看网络状态&#xff09; 三、UDP协议 1、UDP协议格式 2、UDP协议如何进行封装、解包、分用 2.1封装、解包 2.2分用 3、UDP协议的特点 3.1UDP协议的特点 …

C# 控制台彩色深度打印 工具类

文章目录 前言Nuget 环境安装代码使用打印结果 总结 前言 有时候我们想要靠打印获得程序信息&#xff0c;因为Dubeg模式需要一点一点断点进入进出&#xff0c;但是我们觉得断点运行实在是太慢了&#xff0c;还是直接打印后找结果会好一点。 Nuget 环境安装 想自己写的话可以看…

试卷去手写内容在线擦除,使用这个方法轻松达成

在数字时代&#xff0c;越来越多的人开始使用电子设备来完成日常任务。即使在考试时&#xff0c;许多学生也选择使用电子设备来写答案&#xff0c;而不是在试卷上手写。然而&#xff0c;有时候我们需要手写答案&#xff0c;但当我们想要更改或者擦除时&#xff0c;这将是一个麻…

TypeScript 类型断言

TypeScript 类型断言 简单来说类型断言就是 使用as关键词 强行指定获取到的结果类型 应用场景 // 类型断言: 强行指定获取到的结果类型// 应用场景// 页面上有一个 id 为 link 的 a 标签// 我们知道它是 a 标签// 但是 TS 不知道 // document.getElementById 的返回值是 HTMLE…

区块链实验室(17) - FISCO BCOS的P2P网络层分析

首先启动FISCO BCOS的示例网络&#xff0c;即4个节点的强连通网络。每个节点与其余3个节点存在网络连接。 打开控制台&#xff0c;可以看到当前有21个区块。 其中1个节点的P2P端口是30301&#xff0c;监测这个节点的端口。 该端口的部分流量见下图所示。白底部分是某1秒钟接收到…

f12 CSS网页调试_css样式被划了黑线怎么办

我的问题是这样的 class加上去了,但是样式不生效,此时可能是样式被其他样式覆盖了, 解决方案就是 给颜色后边添加一个!important

IDEA中怎么使用git下载项目到本地,通过URL克隆项目(giteegithub)

点击 新建>来自版本控制的项目 点击后会弹出这样一个窗口 通过URL拉取项目代码 打开你要下载的项目仓库 克隆>复制 gitee github也是一样的 返回IDEA 将刚刚复制的URL粘贴进去选择合适的位置点击克隆 下载完成

Java方法重写

目录 1.什么是方法重写 2.方法重写的规则 3.重写与重载的区别 1.什么是方法重写 重写&#xff08;override&#xff0c;也称为覆盖&#xff09;&#xff1a;在子类中对父类中允许访问的方法的实现过程进行重新编写&#xff0c;子类中方法的名称、返回值类型、参数列表与父类…

部署Tomcat和jpress应用

静态页面&#xff1a;静态页面是指在服务器上提前生成好的HTML文件&#xff0c;每次用户请求时直接返回给用户。静态页面的内容是固定的&#xff0c;不会根据用户的请求或其他条件进行变化。静态页面的优点是加载速度快&#xff0c;对服务器资源要求较低&#xff0c;但缺点是无…

从URL取值传给后端

从URL传值给后端 http://127.0.0.1:8080/blog_content.html?id8点击浏览文章详情&#xff0c;跳转至详情页面 从 url 中拿出文章 id&#xff0c;传给后端 首先拿到url然后判断是否有值&#xff0c;从问号后面取值params.split(&) 以 & 作为分割然后遍历字符数组 param…

TFTP 的使用操作指南(轻松入门版)

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

opencv基础 42- Scharr算子-cv2.Scharr()(边缘检测基础)

Scharr算子是用于计算图像梯度的一种常用算子&#xff0c;特别是在边缘检测任务中。它是Sobel算子的改进版本&#xff0c;旨在提供更加准确和敏感的边缘检测。 在离散的空间上&#xff0c;有很多方法可以用来计算近似导数&#xff0c;在使用 33 的 Sobel 算子时&#xff0c;可能…

简述Mysql索引

一、索引概述 1.1 索引概述 MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 索引的本质&#xff1a;索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”&#xff0c;满足特定查找算法。 这些数据结…

uniapp小程序console.log在微信开发者工具中不打印问题

最近在开发一款uniapp小程序&#xff0c;发现console.log在微信开发者工具中不打印&#xff0c;但在H5页面就能够有打印输出&#xff0c;于是在网上寻找原因… 主要是由于vue.config.js文件中有设置发布时删除console的配置&#xff0c;如下&#xff1a; 官网参考地址&#x…

LeetCode 130. 被围绕的区域

题目链接&#xff1a;130. 被围绕的区域 题目描述 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 ‘X’ 和 ‘O’ &#xff0c;找到所有被 ‘X’ 围绕的区域&#xff0c;并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 示例1&#xff1a; 输入&#xff1a;board [[“…

SQL Server数据库如何添加mysql链接服务器(Windows系统)

SQL Server数据库如何添加mysql链接服务器&#xff08;Windows系统&#xff09; 一、说明二、下载mysql的odbc驱动三、安装mysql odbc四、配置ODBC4.1 控制面板→ODBC数据源&#xff08;64位&#xff09;→双击打开4.2 添加msql odbc数据源 五、测试添加是否成功六、打开SSMS&a…

ChatGPT的 6 个强势升级:重点是超强的文件上传和分析功能也来啦!

发布会核心概览 前日凌晨&#xff0c;OpenAI在社交平台上宣布了一系列新功能&#xff0c;旨在提升用户体验。这6 个新功能包括 “提示示例、回答建议、GPT-4默认选择、可分析上传多个文件、保持登录状态和键盘快捷键”。 其中&#xff0c;可分析上传多个文件的功能非常强大。结…

react搭建在线编辑html的站点——引入grapes实现在线拖拉拽编辑html

文章目录 ⭐前言⭐搭建react ts项目⭐引入grapes 插件⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于react搭建在线编辑html的站点。 react 发展历史 React是由Facebook开发的一种JavaScript库&#xff0c;用于构建用户界面。React最初发布于2013年&…