当前位置: 首页 > news >正文

第3章 3.3日志 .NET Core日志 NLog使用教程

 3.3.1 .NET Core日志基本使用

书中介绍了把日志输出到控制台的使用方式:

安装 Microsoft.Extensions.Logging 和 Microsoft.Extensions.Logging.Console

日志记录代码:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;ServiceCollection services = new ServiceCollection();
//将与日志相关的服务注册到容器中 ,AddConsole将日志输出到控制台
services.AddLogging(logBuilder => { logBuilder.AddConsole(); });
using (var sp=services .BuildServiceProvider())
{var logger = sp.GetRequiredService<ILogger<Program>>();logger.LogWarning("警告信息:八嘎呀路!");logger.LogError("错误信息:内蒙古海军上校詹姆斯下士于玉菊!");logger.LogInformation("正常日志信息:Chinese东北东四省:黑龙江、吉林、辽宁、日本");Console.ReadKey();
}

调试运行结果:

3.3.2 文件日志提供程序 NLog

杨老师在随书视频教程中讲了NLog的应用,我之前也自己用过NLog并有相关的应用教程:

.NET 日志记录 NLog包的使用_net nlog-CSDN博客

.Net记录日志的方式有多种,比如

System.Diagnostics.Trace 可以通过 System.Diagnostics.Trace 类记录调试和错误信息。它支持不同的监听器(例如:控制台、文件、事件日志等)来接收日志输出。

NLog NLog 是一个灵活且功能强大的开源日志库,支持多种日志级别和多种目标(如文件、数据库、邮件等)。

Serilog Serilog 是另一个强大的日志库,支持结构化日志,可以方便地记录复杂数据结构。

Log4Net Log4Net 是 Apache 提供的日志库,功能全面且使用广泛,适用于各种应用程序。

本文主要介绍NLog的使用

1. 安装NLog

在NuGet程序管理中搜索NLog,点击安装

或者使用 NuGet 包管理器控制台命令:

Install-Package NLog

在 【视图】-【其他窗口】-【程序包管理器控制台】,在控制台中输入Install-Package NLog进行安装。

2. 配置

在项目中添加config文件

编辑配置文件

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><targets><!-- 将日志写入 date-based 文件 --><target xsi:type="File" name="fileTarget" fileName="logs/log_${shortdate}.txt" layout="${longdate}|${level:uppercase=true}|${logger}|${message}" archiveEvery="Day"                 <!-- 每天生成新的日志文件 -->archiveNumbering="Date"            <!-- 归档文件根据日期命名 -->maxArchiveFiles="7"                <!-- 最多保留 7 个归档文件 -->/><!-- 将日志输出到控制台 --><target xsi:type="Console" name="consoleTarget" layout="${longdate}|${level:uppercase=true}|${logger}|${message}" /></targets><rules><!-- 记录所有等级的日志到文件 --><logger name="*" minlevel="Debug" writeTo="fileTarget" /><!-- 记录错误及以上级别的日志到控制台 --><logger name="*" minlevel="Error" writeTo="consoleTarget" /></rules>
</nlog>

配置说明:

  • fileName="logs/log_${shortdate}.txt":使用 ${shortdate} 占位符,NLog 会自动将其替换为当前日期(格式为 yyyy-MM-dd),从而生成每天新的日志文件,如 logs/log_2023-10-09.txt
  • archiveEvery="Day":这个设置会让 NLog 每天在日志轮转时创建一个新的日志文件。
  • archiveNumbering="Date":归档文件将以日期编号,这样每个归档文件都将带有相应的日期。
  • maxArchiveFiles="7":最多保留 7 个归档文件,超过这个数量的文件将被删除。

3.应用

  class Program{// 创建一个 logger 实例private static readonly Logger logger = LogManager.GetCurrentClassLogger();static async Task Main(string[] args){try{logger.Debug("调试日志");logger.Info("程序开始运行");Class1 class1 = new Class1();// 可能会发生异常的代码throw new Exception("一个示例异常65265");}catch (Exception ex){// 记录异常信息logger.Error( ex.Message);}finally{// 确保最后记录一些结束信息logger.Info("程序结束");}}}

4. 其他详情

4.1 关于rules

在 NLog 配置文件中的 <rules> 部分,name="*" 表示日志记录器的名称匹配所有的日志记录器。具体来说:

  • * 是一个通配符,表示匹配任何名称的日志记录器。这意味着这一规则适用于所有类别的日志(无论是哪个类、命名空间或组件所记录的日志)。
<logger name="*" minlevel="Debug" writeTo="fileTarget" />

这条规则的意思是:所有名称的日志记录器(即所有的日志消息)都会被记录到指定的 fileTarget 目标中,条件是日志级别大于或等于 Debug。换句话说,Debug、Info、Warn、Error 和 Fatal 等级的日志都会被写入到文件中。

<logger name="*" minlevel="Error" writeTo="consoleTarget" />

这条规则的意思是:所有名称的日志记录器都会将日志级别大于或等于 Error 的消息输出到控制台。这意味着只有 Error 和 Fatal 等级的日志才会在控制台上显示。

4.2 关于日志的等级

NLog 日志等级用于指示日志消息的严重性,并帮助开发者过滤和查找日志信息。NLog 支持以下几种日志等级(从最低到最高):

  1. Trace:用于跟踪代码的执行流程和详细的调试信息。适合开发阶段使用,通常用于记录非常详细的消息。

  2. Debug:用于调试目的的详细信息,通常用于开发和测试阶段。帮助开发者理解程序的内部运作。

  3. Info:用于常规的信息性消息,表示程序的正常运行状态。例如,记录用户操作、系统事件等。

  4. Warn:用于警告性消息,表示可能的潜在问题,但不会影响程序的正常运行。例如,某些依赖项不可用,但程序仍然可以继续运行。

  5. Error:用于记录错误消息,表示程序运行中发生了异常。通常需要关注,以便后续进行错误处理。

  6. Fatal:用于重大错误消息,表示系统无法继续运行。通常指的是严重的运行时错误,导致程序崩溃或无法恢复的状态。

日志等级排序

这几种日志等级的排序从低到高,如下:

  1. Trace
  2. Debug
  3. Info
  4. Warn
  5. Error
  6. Fatal

3.3.3 集中式日志

长话短说:在分布式环境中,为了方便管理日志,最好采用集中式的日志服务器,各个服务器都把产生的日志写入专用的日志服务器。

杨老师推荐了两个集中式日志的开源项目:ExceptionlessELK

ELK是目前非常流行的开源集中式日志分析系统之一,不过由于ELK是Java开发的,因此对于不熟悉Java的同志不太友好,所以推荐使用Exceptionless ,Exceptionless的开发人员主推他们的日志云服务,不用自己搭建服务器,而是直接购买他们的云服务,然后程序直接把日志发送给他们的服务器即可。

巴拉巴拉说了一堆,最后的建议是:他俩的服务器都在境外,访问比较缓慢,因此一般都是自己选择开源的集中式日志系统进行部署日志服务器。

3.4 第三章小结

本章介绍了依赖注入、配置系统和日志这3个模块。依赖注入可以让程序组件以低耦合的
形式组装在一起;配置系统允许我们通过命令行、环境变量、配置文件甚至自定义配置源来进
行系统的配置,多配置源的机制能让我们更灵活地对系统进行配置;使用日志功能,可以把日
志信息按照不同的级别输出,也可以在不改变业务代码的前提下,对于日志的输出进行灵活的
定制。

相关文章:

第3章 3.3日志 .NET Core日志 NLog使用教程

3.3.1 .NET Core日志基本使用 书中介绍了把日志输出到控制台的使用方式&#xff1a; 安装 Microsoft.Extensions.Logging 和 Microsoft.Extensions.Logging.Console 日志记录代码&#xff1a; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.…...

R语言NIMBLE、Stan和INLA贝叶斯平滑及条件空间模型死亡率数据分析:提升疾病风险估计准确性...

全文链接&#xff1a;https://tecdat.cn/?p40365 在环境流行病学研究中&#xff0c;理解空间数据的特性以及如何通过合适的模型分析疾病的空间分布是至关重要的。本文主要介绍了不同类型的空间数据、空间格点过程的理论&#xff0c;并引入了疾病映射以及对空间风险进行平滑处理…...

Java 反射 (Reflection) 详解

一、什么是 Java 反射&#xff1f; Java 反射 (Reflection) 是 Java 语言的一个强大特性&#xff0c;它允许 在运行时 检查和修改类、接口、字段和方法的信息&#xff0c;而不需要在编译时知道这些信息。 换句话说&#xff0c;反射可以让你在程序运行过程中“动态”地获取类的…...

在 C++ 中,`QMessageBox_s::question_s2` 和 `app.question_s2` 的区别(由DS-V3生成)

在 C 中&#xff0c;QMessageBox_s::question_s2 和 app.question_s2 的区别主要在于它们的调用方式和上下文范围。以下是对两者的详细解释&#xff1a; 1. QMessageBox_s::question_s2 解释&#xff1a; QMessageBox_s::question_s2 是一个静态成员函数的调用。它属于类 QMess…...

vxe-grid 通过配置式给单元格字段格式化树结构数据,转换树结构节点

vxe-grid 通过配置式给单元格字段格式化树结构数据&#xff0c;转换树结构节点 比如用户自定义配置好的数据源&#xff0c;通过在列中配置好数据&#xff0c;全 json 方式直接返回给前端渲染&#xff0c;不需要写任何格式化方法。 官网&#xff1a;https://vxetable.cn npm i…...

大厂算法面试常见问题总结:高频考点与备战指南

在大厂算法面试中&#xff0c;数据结构与算法是必考的核心内容。 无论是校招还是社招&#xff0c;算法题的表现往往决定了面试的成败。 为了帮助大家更好地备战&#xff0c;本文总结了大厂算法面试中的高频考点&#xff0c;并提供了详细的备战建议&#xff0c;助你轻松应对面…...

制造行业CRM选哪家?中大型企业CRM选型方案

在当今竞争激烈的制造行业中&#xff0c;企业对于客户关系管理&#xff08;CRM&#xff09;系统的需求日益增强&#xff0c;高效、智能的CRM系统已成为推动企业业务增长、优化客户体验的关键。在制造业 CRM 市场中&#xff0c;纷享销客和销售易都备受关注&#xff0c;且各自有着…...

PHP集成软件用哪个比较好?

在Windows环境下&#xff0c;使用PHP时&#xff0c;通常需要一个集成开发环境&#xff08;IDE&#xff09;或者集成软件来简化开发和调试过程。以下是几款常用且推荐的PHP集成软件&#xff0c;每款都有其特点&#xff0c;可以根据需求进行选择&#xff1a; 1. XAMPP 特点&…...

当pcie设备变化时centos是否会修改网络设备的名称(AI回答)

当pcie设备变化时centos是否会修改网络设备的名称 在CentOS&#xff08;以及其他基于Linux的操作系统&#xff09;中&#xff0c;网络接口的命名通常遵循特定的规则&#xff0c;尤其是在使用PCIe设备&#xff08;如网络适配器&#xff09;时。网络接口的命名通常基于设备的物理…...

Mac arm架构使用 Yarn 全局安装 Vue CLI

dgqdgqdeMacBook-Pro spid-admin % vue --version zsh: command not found: vue要使用 Yarn 安装 Vue CLI&#xff0c;你可以执行以下命令&#xff1a; yarn global add vue/cli这个命令会全局安装 Vue CLI&#xff0c;让你可以使用 vue 命令创建、管理 Vue.js 项目。以下是一…...

【Python游戏】双人简单对战游戏

以下是一个使用 Python 的 pygame 库实现的简单对战游戏示例&#xff0c;游戏中玩家可以控制两个角色进行对战&#xff0c;并且支持自定义图片(最好使用无底色的png图片)。完整源码以及实现思路&#xff1a; import pygame import os# 初始化 Pygame pygame.init()# 设置游戏窗…...

Windows11切换回Windows10风格右键菜单

参考文章&#xff1a;Win11新版右键菜单用不惯&#xff1f;一键切换回Win10经典版&#xff01;-CSDN博客 以管理员权限运行命令行cmd 切换为经典旧版右键菜单&#xff0c;执行 reg.exe add “HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServe…...

怎么学习调试ISP的参数

摄像头的 **Sensor 获取的 RAW 数据** 是未经处理的原始图像数据&#xff0c;通常需要经过 **ISP&#xff08;Image Signal Processor&#xff0c;图像信号处理器&#xff09;** 的处理&#xff0c;才能生成可用的图像或视频。ISP 的作用是对 RAW 数据进行一系列图像处理操作&a…...

“三次握手”与“四次挥手”:TCP传输控制协议连接过程

目录 什么是TCP协议 “三次握手”建立连接 “四次挥手”断开连接 “三次握手”和“四次挥手”的反思 总结 什么是TCP协议 想象一下&#xff0c;你和远方的朋友要进行一场电话交流&#xff0c;但这通电话不仅仅是随便聊聊&#xff0c;而是要传递一封重要的信件。为了确保这…...

OpenCV形态学操作

1.1. 形态学操作介绍 初识&#xff1a; 形态学操作是一种基于图像形状的处理方法&#xff0c;主要用于分析和处理图像中的几何结构。其核心是通过结构元素&#xff08;卷积核&#xff09;对图像进行扫描和操作&#xff0c;从而改变图像的形状和特征。例如&#xff1a; 腐蚀&…...

深入理解WebSocket接口:如何使用C++实现行情接口

在现代网络应用中&#xff0c;实时数据传输变得越来越重要。通过WebSocket&#xff0c;我们可以建立一个持久连接&#xff0c;让服务器和客户端之间进行双向通信。这种技术不仅可以提供更快的响应速度&#xff0c;还可以减少不必要的网络流量。本文将详细介绍如何使用C来实现We…...

汇能感知的光谱相机/模块产品有哪些?

CM020A 分辨率&#xff1a;1600H1200V 光谱范围&#xff1a;350~950nm 光谱分辨率&#xff1a;1nm 接口&#xff1a;USB2.0 帧率&#xff1a;16001200 (6帧) 输出格式&#xff1a;Raw 8bit FOV&#xff1a;D73.5H58.8V44.1 相机尺寸&#xff1a;505055mm VM02S10 分辨率…...

抓包工具是什么?

抓包工具是一种用于捕获和分析网络数据包的软件或硬件设备。它可以帮助用户监控网络通信过程&#xff0c;查看网络中传输的数据内容、协议类型、源地址、目的地址等信息。以下是关于抓包工具的一些详细解释&#xff1a; 1. 主要功能 捕获数据包&#xff1a;抓包工具能够实时捕…...

Kubernetes的Ingress 资源是什么?

在Kubernetes中&#xff0c;Ingress资源是一种用于管理集群外部对内部服务访问的API对象&#xff0c;主要用于将不同的外部请求路由到集群内的不同服务&#xff0c;以下是关于它的详细介绍&#xff1a; 定义与作用 Ingress资源定义了从集群外部到内部服务的HTTP和HTTPS路由规…...

【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致

业务场景 发布信息&#xff0c;更新到数据库MySQLCOS操作&#xff0c;更新JSON文件 不过可能存在幂等性和数据一致性的问题。 // 批量存MySQL entityPublishService.saveOrUpdateBatch(entityPublishList); // 遍历批量存COS对象存储searchEntitys.forEach(req -> {//删除…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...