【后端】.NET Core API框架搭建(9) --配置使用Log4Net日志

       

目录

1.添加包

2.新建公用类

3.新建配置

4.注册

        4.1.类库项目设置

5.使用


         在 .NET Core 项目中使用 Log4Net 做日志记录,具有很多优势。尽管 .NET Core 自带了 ILogger 接口(如使用内置的 ConsoleLoggerDebugLogger 等),但 Log4Net 提供了更强大、灵活和可配置的日志功能,尤其适合企业级应用或需要精细控制日志输出的场景。

1.添加包

        添加 log4net 和 Microsoft.Extensions.Logging.Log4Net.AspNetCore 包。

2.新建公用类

        创建 LogHelper 公共静态类。

using log4net;
using System.Collections.Concurrent;
using System.Runtime.CompilerServices;namespace Frame5_LibraryLogger.LogHelper
{/// <summary>/// 日志类-记录调用名称/// </summary>public static class LogHelper{// 缓存 ILog 对象(线程安全)private static readonly ConcurrentDictionary<string, ILog> _loggerCache = new ConcurrentDictionary<string, ILog>();// 获取 ILog 实例(确保只初始化一次)private static ILog GetLogger([CallerMemberName] string caller = ""){return _loggerCache.GetOrAdd(caller, LogManager.GetLogger);}/// <summary>/// 记录 DEBUG 级别日志/// </summary>public static void Debug(string message, [CallerMemberName] string caller = ""){var logger = GetLogger(caller);if (logger.IsDebugEnabled)logger.Debug(message);}/// <summary>/// 记录 INFO 级别日志/// </summary>public static void Info(string message, [CallerMemberName] string caller = ""){var logger = GetLogger(caller);if (logger.IsInfoEnabled)logger.Info(message);}/// <summary>/// 记录 WARN 级别日志/// </summary>public static void Warn(string message, [CallerMemberName] string caller = ""){GetLogger(caller).Warn(message);}/// <summary>/// 记录 ERROR 级别日志/// </summary>public static void Error(string message, Exception ex = null, [CallerMemberName] string caller = ""){var logger = GetLogger(caller);if (ex != null)logger.Error(message, ex);elselogger.Error(message);}/// <summary>/// 记录 FATAL 级别日志/// </summary>public static void Fatal(string message, Exception ex = null, [CallerMemberName] string caller = ""){var logger = GetLogger(caller);if (ex != null)logger.Fatal(message, ex);elselogger.Fatal(message);}}
}

        案例如下

3.新建配置

        新建 log4net.config 应用程序配置文件

        点击所需项目 → 添加 → 新建项目 → 右上角搜索 应用程序配置文件

<?xml version="1.0" encoding="utf-8"?>
<!-- XML文件声明,版本1.0,UTF-8编码 -->
<log4net><!-- 开始log4net配置 --><!-- 关闭所有Microsoft开头的命名空间日志 --><logger name="Microsoft"><level value="OFF" /></logger><!-- 关闭System开头的命名空间日志 --><logger name="System"><level value="OFF" /></logger><!-- INFO级别日志配置开始 --><appender name="InfoFileAppender" type="log4net.Appender.RollingFileAppender"><!-- 定义一个名为InfoFileAppender的appender,使用滚动文件类型 --><file type="log4net.Util.PatternString" value="logs/INFO/INFO_" /><!-- 日志文件路径模板,使用PatternString支持动态路径 --><datePattern value="yyyy-MM-dd'.txt'" /><!-- 日期模式,用于文件滚动命名,每天生成一个新文件 --><staticLogFileName value="false" /><!-- 不使用静态文件名,允许根据日期模式变化 --><appendToFile value="true" /><!-- 以追加模式写入文件,不清空原有内容 --><rollingStyle value="Date" /><!-- 滚动策略:按日期滚动 --><layout type="log4net.Layout.PatternLayout"><!-- 定义日志输出布局为模式布局 --><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /><!-- 日志格式:%date - 日期时间[%thread] - 线程ID%-5level - 日志级别(左对齐,5字符宽度)%logger - 记录器名称%message - 日志消息%newline - 换行符--></layout><filter type="log4net.Filter.LevelMatchFilter"><!-- 添加级别匹配过滤器 --><levelToMatch value="INFO" /><!-- 只匹配INFO级别日志 --></filter><filter type="log4net.Filter.DenyAllFilter" /><!-- 拒绝所有不匹配的日志 --></appender><!-- DEBUG级别日志配置开始 --><appender name="DebugFileAppender" type="log4net.Appender.RollingFileAppender"><!-- 定义DEBUG级别appender --><file type="log4net.Util.PatternString" value="logs/DEBUG/DEBUG_" /><!-- DEBUG日志文件路径 --><datePattern value="yyyy-MM-dd'.txt'" /><!-- 日期格式 --><staticLogFileName value="false" /><!-- 动态文件名 --><appendToFile value="true" /><!-- 追加模式 --><rollingStyle value="Date" /><!-- 按日期滚动 --><layout type="log4net.Layout.PatternLayout"><!-- 布局配置 --><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /><!-- 同INFO格式 --></layout><filter type="log4net.Filter.LevelMatchFilter"><!-- DEBUG级别过滤器 --><levelToMatch value="DEBUG" /></filter><filter type="log4net.Filter.DenyAllFilter" /><!-- 拒绝其他级别 --></appender><!-- WARN级别日志配置开始 --><appender name="WarnFileAppender" type="log4net.Appender.RollingFileAppender"><!-- WARN级别appender定义 --><file type="log4net.Util.PatternString" value="logs/WARN/WARN_" /><!-- WARN日志路径 --><datePattern value="yyyy-MM-dd'.txt'" /><!-- 日期格式 --><staticLogFileName value="false" /><!-- 动态文件名 --><appendToFile value="true" /><!-- 追加模式 --><rollingStyle value="Date" /><!-- 按日期滚动 --><layout type="log4net.Layout.PatternLayout"><!-- 布局配置 --><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout><filter type="log4net.Filter.LevelMatchFilter"><!-- WARN级别过滤器 --><levelToMatch value="WARN" /></filter><filter type="log4net.Filter.DenyAllFilter" /><!-- 拒绝其他级别 --></appender><!-- ERROR级别日志配置开始 --><appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender"><!-- ERROR级别appender --><file type="log4net.Util.PatternString" value="logs/ERROR/ERROR_" /><!-- ERROR日志路径 --><datePattern value="yyyy-MM-dd'.txt'" /><!-- 日期格式 --><staticLogFileName value="false" /><!-- 动态文件名 --><appendToFile value="true" /><!-- 追加模式 --><rollingStyle value="Date" /><!-- 按日期滚动 --><layout type="log4net.Layout.PatternLayout"><!-- 布局配置 --><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout><filter type="log4net.Filter.LevelMatchFilter"><!-- ERROR级别过滤器 --><levelToMatch value="ERROR" /></filter><filter type="log4net.Filter.DenyAllFilter" /><!-- 拒绝其他级别 --></appender><!-- FATAL级别日志配置开始 --><appender name="FatalFileAppender" type="log4net.Appender.RollingFileAppender"><!-- FATAL级别appender --><file type="log4net.Util.PatternString" value="logs/FATAL/FATAL_" /><!-- FATAL日志路径 --><datePattern value="yyyy-MM-dd'.txt'" /><!-- 日期格式 --><staticLogFileName value="false" /><!-- 动态文件名 --><appendToFile value="true" /><!-- 追加模式 --><rollingStyle value="Date" /><!-- 按日期滚动 --><layout type="log4net.Layout.PatternLayout"><!-- 布局配置 --><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout><filter type="log4net.Filter.LevelMatchFilter"><!-- FATAL级别过滤器 --><levelToMatch value="FATAL" /></filter><filter type="log4net.Filter.DenyAllFilter" /><!-- 拒绝其他级别 --></appender><!-- 根记录器配置开始 --><root><!-- 根日志记录器配置 --><level value="ALL" /><!-- 记录所有级别的日志 --><appender-ref ref="InfoFileAppender" /><!-- 引用INFO appender --><appender-ref ref="DebugFileAppender" /><!-- 引用DEBUG appender --><appender-ref ref="WarnFileAppender" /><!-- 引用WARN appender --><appender-ref ref="ErrorFileAppender" /><!-- 引用ERROR appender --><appender-ref ref="FatalFileAppender" /><!-- 引用FATAL appender --></root></log4net>
<!-- log4net配置结束 -->

        案例如下

4.注册

        在 Program 或 Startup 中注册日志。

//构建 log4net 配置文件的完整路径
var configFilePath = Path.Combine(AppContext.BaseDirectory, "log4net.config");
//将 log4net 集成到 .NET Core 的统一日志系统中
builder.Logging.AddLog4Net(configFilePath);

        案例如下

 

        4.1.类库项目设置

        如果是类库项目,需设置 log4net.config 文件属性

        点击到文件 → 属性 → 设置

        复制到输出目录:始终赋值 / 如果较新则复制

        生成操作: 内容

5.使用

        在需要的地方可以随意使用。

using Frame4_LibraryCore.BaseConfig;
using Frame5_LibraryLogger.LogHelper;
using Microsoft.AspNetCore.Mvc;namespace DemoAPI.Controllers
{/// <summary>/// 日志测试控制器/// </summary>//[Authorize]// 保护整个控制器[Route("api/[controller]/[action]")]//标记路由地址规格[ApiController] // 标记该类为 API 控制器,启用一些默认的行为,如模型绑定、输入验证等[ApiExplorerSettings(GroupName = nameof(ApiVersionInfo.V1))]//设置控制器的API版本public class LoggerController : BaseController{/// <summary>/// 测试日志/// </summary>/// <returns></returns>[HttpGet]public bool InsertLogAsync(){//测试日志LogHelper.Info("Info");LogHelper.Error("Error");LogHelper.Debug("Debug");LogHelper.Fatal("Fatal");LogHelper.Warn("Warn");return true;}}
}

        案例如下

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

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

相关文章

Agent交互细节

本文参考了https://www.bilibili.com/video/BV1v9V5zSEHA/视频及原作者代码实践 本文主要实践在第3节1、MCP MCP官方地址&#xff1a;https://modelcontextprotocol.io/introduction MCP 是一个开放协议&#xff0c;它规范了应用程序向 LLM 提供上下文的方式。 架构&#xff1a…

AI+医疗!VR和MR解剖学和针灸平台,智能时代如何重塑健康未来

在智能时代&#xff0c;“AI医疗”正从精准诊断入手&#xff0c;推动医疗系统变革&#xff0c;通过个性化健康管理、智能诊疗辅助等方式重塑健康未来&#xff01;将人工智能&#xff08;AI&#xff09;与虚拟实境&#xff08;VR&#xff09;应用到中医教学&#xff0c;透过该系…

Sersync和Rsync部署

学习参考连接 以下是我在学习过程中借鉴的经验和下载资源链接&#xff0c;感谢几位大佬的帮助&#xff0c;也供各位参考。 Rsync踩坑&#xff1a; https://blog.csdn.net/XiaoXiaoYunXing/article/details/120160395 Sersync下载源 http://down.whsir.com/downloads/sersy…

Django基础(四)———模板常用过滤器

前言上篇文章给大家介绍了DTL模板的部分知识点这篇文章继续带大家深入理解Django框架中的模板过滤器一、模板常用过滤器1.add将传进来的参数添加到原来的值上面。这个过滤器会尝试将值和 参数转换成整形然后进行相加。如果转换成整形过程中失败了&#xff0c;那么会将值和参数进…

国内MCP服务器搜索引擎有哪些?MCP导航站平台推荐

在人工智能技术蓬勃发展的今天&#xff0c;AI模型与外部工具和服务的交互能力正成为推动技术进步的关键。AIbase&#xff08;<https://mcp.aibase.cn/>&#xff09;作为一个专注于MCP(Model Context Protocol&#xff0c;模型上下文协议)服务器的集合平台&#xff0c;为全…

Python中with的作用和用法

在这里我们来详细解释一下Python中非常重要的 with 语句。 我会从 “为什么需要它” 开始&#xff0c;然后讲解 “它是什么以及如何使用”&#xff0c;最后深入到 “它的工作原理” 和 “如何自定义”。1. 为什么需要 with 语句&#xff1f;(The Problem) 在编程中&#xff0c;…

缓存雪崩、缓存穿透,缓存击穿

Redis是一个完全开源免费的高性能非关系型&#xff08;NOSQL&#xff09;的key-value数据库。 Redis不可能把所有的数据都缓存起来(内存昂贵且有限)&#xff0c;所以Redis需要对数据 设置过期时间&#xff0c;并采用的是惰性删除定期删除两种策略对过期键删除。Redis对过期键的…

springmvc跨域解决方案

在Spring MVC中处理跨域请求&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;通常涉及到配置HTTP响应头&#xff0c;以允许来自不同源的请求。Spring MVC提供了多种方式来配置CORS&#xff0c;包括全局配置和局部配置。 使用CrossOrigin注解 在控制器的…

btstack移植之安全配对(二)

3.13.3 Legacy配对首先&#xff0c;我们回复的paring response中&#xff0c;可以看到我们不支持secure connection&#xff0c;所以我们走的是legacy配对模式。图3-74 secure连接不支持然后&#xff0c;master在pairing confirm包中回复了confirm value。图3-75 master发送con…

FRP配置( CentOS 7 上安装 FRP教程 )

** 如果你们公司没有公网IP&#xff0c;但是又想实现内网穿透&#xff0c;远程调用接口&#xff0c;在家也能调用公司服务器&#xff0c;但是nkg ssl有问题&#xff0c;花生壳坑壁&#xff0c;那么FRP是你最佳的选择&#xff01;&#xff01;&#xff01;** 不过有个前提&#…

第三次mysql作业

建立库建立mydb11_syu库2.创建s表&#xff0c;创建sc表二&#xff0e;插入数据向s表插入数据2.向sc表插入数据三&#xff0e;查询1.分别查询student表和score表的所有记录2.查询student表的第2条到5条记录3.从student表中查询计算机系和英语系的学生的信息4.从student表中查询年…

不同场景下git指令的搭配

添加账号 git config --global user.name "YourName" git config --global user.email "your_emailexample.com"设置 Git 默认分支名称为 main&#xff1a; git config --global init.defaultBranch main初始化仓库&#xff1a; git init配置SSH 密钥 如果…

NLP——迁移学习

一、迁移学习的概念 1.预训练模型(Pretrained model) 定义: 简单来说别人训练好的模型。一般预训练模型具备复杂的网络模型结构&#xff1b;一般是在大量的语料下训练完成的。 2.微调(Fine-tuning) 定义:一般是对预训练语言模型&#xff0c;进行垂直领域数据的微调&#xff0c;…

Ubuntu 安装

文章目录硬件准备下载 Ubuntu 镜像创建可启动 USB从 USB 驱动器启动安装 Ubuntu不要忘记更新&#xff01;用了十多年的笔记本&#xff0c;手边正好有个500G的固态&#xff0c;准备换上。考虑到机器的硬件配置&#xff0c;现在使用windows10实在是有点卡&#xff0c;ubuntu却刚好…

【46】MFC入门到精通——MFC显示实时时间,获取系统当前时间GetCurrentTime()、获取本地时间GetLocalTime()

文章目录1 MFC获取时间方法方法一&#xff1a;获取系统当前时间GetCurrentTime()方法二&#xff1a;获取本地时间GetLocalTime()使用GetTickCount()获取程序运行时间2 MFC显示实时时间 使用方法2.1 获取时间2.2 类向导 添加定时器函数 OnTimer2.3 初始化 设置定时器2.4 定时器函…

Linux717 SWAP扩容;逻辑卷条带化

root192.168.235.20s password:┌────────────────────────────────────────────────────────────────────┐│ • MobaXterm 20.0 • ││ …

人类社会发展过程中的熵增定律

引子研究美国罗斯福新政期间的法案为什么会对美国经济恢复起作用&#xff1f;与千金买马骨和移木赏金之间的区别与联系&#xff1f;以下为豆包 AI回答一、罗斯福新政法案对美国经济起作用的原因罗斯福新政&#xff08;1933-1939年&#xff09;通过一系列政策应对大萧条&#x…

Spring-AI系列-入门篇-核心概念、组件和生产要素

原文-Spring AI知识库&#xff0c;欢迎大家评论互动 师父领进门&#xff0c;修行靠自己。 Spring AI is an application framework for AI engineering. Its goal is to apply to the AI domain Spring ecosystem design principles such as portability and modular design an…

从浏览器到服务器:TCP 段的网络传输之旅

本文以简化的网络架构为例&#xff0c;详细介绍了当你在浏览器中输入网址&#xff08;例如www.google.com&#xff09;并按下回车键后&#xff0c;TCP段的完整传输过程。我们将探讨DNS解析、ARP、TCP/IP封装、PAT和路由如何协同工作&#xff0c;将数据从个人电脑通过局域网和广…

HCIE - 云计算拿下后的职业选择如何规划?

Hello&#xff01;大家好&#xff0c;小编是一名专注 IT 领域的资深探索家。我们聊聊HCIE - 云计算&#xff0c;这个认证作为华为认证体系中云计算领域的专家级认证&#xff0c;标志着持有者具备企业级云架构设计、复杂云平台运维及跨场景技术落地能力。但认证本身只是职业进阶…