日志概念

        日志级别

      NET (Microsoft.Extensions.Logging) 中定义的 6 个标准日志级别,按严重性从低到高排列:

日志级别数值描述典型使用场景
Trace0最详细的信息,包含敏感数据(如请求体、密码哈希等)。仅在开发或深度故障排除时启用。记录方法入口/出口、详细变量值、低级别通信细节。
Debug1开发调试信息。比 Trace 略少细节,但仍包含对开发者有用的内部信息。记录关键变量状态、流程步骤、非性能关键操作的耗时、配置加载值。
Information2应用程序流信息。描述应用程序正常、预期内的操作。服务启动/停止、重要操作完成(如“用户登录成功”、“订单创建”)、主要里程碑事件。
Warning3异常或意外事件,但应用程序仍能继续运行。表明可能需要调查的潜在问题。重试操作、降级功能使用、预期内的外部服务错误、接近资源限制(如磁盘空间不足)。
Error4无法处理的错误。表示当前操作或请求失败,但应用程序整体仍可运行。捕获的异常、数据库连接失败、关键操作失败(如支付处理失败)、外部API调用关键错误。
Critical5最严重的故障,可能导致应用程序崩溃或不可恢复的损坏。需要立即处理。系统崩溃、数据丢失、磁盘空间耗尽、启动失败、灾难性未处理异常。

        日志提供者:需要把日志输出那个地方文件,数据库,控制台等。

        

输出日志到控制台

1.安装Nuget日志所需要的包:

        Microsoft.Extensions.Logging.Console

2.DI注入:

//创建DI容器对象
ServiceCollection services = new ServiceCollection();

       
 services.AddLogging(logBuilder => {
     //容器注入控制台输出
     logBuilder.AddConsole();

详细步骤:

1.创建一个类,使用构造方法注入ILogger<一般填写当前类名> 

 class TestLog
{//定义一个ILogger类型私有变量,泛型中类型填写本类private readonly ILogger<TestLog> logger;//使用构造方法进行注入public TestLog(ILogger<TestLog> logger) { this.logger = logger;}public void Log(){logger.LogDebug("调试记录信息");logger.LogWarning("警告记录信息");logger.LogError("错误记录信息");}}

2.在主程序中创建DI容器,注册服务、添加控制器输出

 public class Program{static void Main(string[] args){//创建DI容器对象ServiceCollection services = new ServiceCollection();services.AddLogging(logBuilder => {//-----------------------------------//容器注入控制台输出logBuilder.AddConsole();//--------------------------------------//设置输出级别为最低logBuilder.SetMinimumLevel(LogLevel.Trace);  });//容器注册服务对象services.AddScoped<TestLog>();//构建一个服务提供者(Service Provider)对象//创建一个 `ServiceProvider` 实例。//-这个 `ServiceProvider` 对象就是依赖注入容器,它负责管理服务的生命周期和解析服务using (var sp = services.BuildServiceProvider()){//获取服务对象TestLog tlog =   sp.GetRequiredService<TestLog>();tlog.Log();Console.ReadKey();}}}

3.输出结果

输出日志到Windows的事件查看器中

1.创建一个类,使用构造方法注入ILogger<一般填写当前类名> 

 class TestLog
{//定义一个ILogger类型私有变量,泛型中类型填写本类private readonly ILogger<TestLog> logger;//使用构造方法进行注入public TestLog(ILogger<TestLog> logger) { this.logger = logger;}public void Log(){logger.LogDebug("调试记录信息");logger.LogWarning("警告记录信息");logger.LogError("错误记录信息");}}

2.在主程序中创建DI容器,注册服务、添加事件查看器输出

 public class Program{static void Main(string[] args){//创建DI容器对象ServiceCollection services = new ServiceCollection();services.AddLogging(logBuilder => {//---------------------------------------//注入windows事件查看器中输出logBuilder.AddEventLog();//---------------------------------------//设置输出级别为最低logBuilder.SetMinimumLevel(LogLevel.Trace);  });//容器注册服务对象services.AddScoped<TestLog>();//构建一个服务提供者(Service Provider)对象//创建一个 `ServiceProvider` 实例。//-这个 `ServiceProvider` 对象就是依赖注入容器,它负责管理服务的生命周期和解析服务using (var sp = services.BuildServiceProvider()){//获取服务对象TestLog tlog =   sp.GetRequiredService<TestLog>();tlog.Log();Console.ReadKey();}}}

3.输出结果

NLog文本日志输出

1.安装Nuget包:NLog.Extensions.Logging

控制台输入:Install-Package  NLog.Extensions.Logging

2..创建配置文件
添加 nlog.config 配置文件(右键项目 → 新建项 → NLog 配置文件),nlog.config 位于项目根目录

内容示例如下:

<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"autoReload="true"internalLogLevel="info"internalLogFile="interal_NLog.log"throwExceptions="false" encoding="utf-8"><targets><!-- 控制台输出 ,layout输出布局格式--><target name="console" xsi:type="Console" layout="${longdate}|${level}|${message}" /><!-- 文件输出(按日期分目录) --><target name="file" xsi:type="File" fileName="Logs/${date:format=yyyy}/${date:format=MM}/${shortdate}.log"layout="${longdate}|${level}|${logger}|${message} ${exception}" /></targets><rules><!--输出日志的匹配规则 ,以name名称进行匹配,输入日志的等级,输出到哪里--><logger name="*" minlevel="Info" writeTo="console,file" /><logger name="*" minlevel="Debug" writeTo="file" /></rules>
</nlog>

关键设置:将文件属性设为 复制到输出目录:【始终复制

3.创建一个类,使用构造方法注入ILogger<一般填写当前类名> 

 class TestLog
{//定义一个ILogger类型私有变量,泛型中类型填写本类private readonly ILogger<TestLog> logger;//使用构造方法进行注入public TestLog(ILogger<TestLog> logger) { this.logger = logger;}public void Log(){logger.LogDebug("调试记录信息");logger.LogWarning("警告记录信息");logger.LogError("错误记录信息");}}

4.在主程序中创建DI容器,注册服务、添加Nlog文本输出

 public class Program{static void Main(string[] args){//创建DI容器对象ServiceCollection services = new ServiceCollection();services.AddLogging(logBuilder => {//========================NLog日志========================//注入NLog日志logBuilder.AddNLog();//========================================================//设置输出级别为最低logBuilder.SetMinimumLevel(LogLevel.Trace);  });//容器注册服务对象services.AddScoped<TestLog>();//构建一个服务提供者(Service Provider)对象//创建一个 `ServiceProvider` 实例。//-这个 `ServiceProvider` 对象就是依赖注入容器,它负责管理服务的生命周期和解析服务using (var sp = services.BuildServiceProvider()){//获取服务对象TestLog tlog =   sp.GetRequiredService<TestLog>();tlog.Log();Console.ReadKey();}}}

配置高级设置

  1. 异步日志提升性能

    <!-- AsyncWrapper 时会自动启用批量写入-->
    <target name="asyncFile" xsi:type="AsyncWrapper"><target xsi:type="File" fileName="logs/async.log" KeepFileOpen=false async="true"/>
    </target>
    • 避免阻塞主线程,适合高并发场景。

  2. 全局诊断上下文(GDC)

    • 设置全局变量(如应用版本):

      NLog.GlobalDiagnosticsContext.Set("AppVersion", "2.0.0");
    • 配置中引用:

      ${gdc:item=AppVersion}

  3. 日志轮转与压缩

    <target xsi:type="File" fileName="logs/app.log"maxArchiveFiles="30"          <!-- 保留30个文件 -->archiveAboveSize="10485760"   <!-- 单个文件 >10MB 时分割 -->enableArchiveFileCompression="true" /> <!--启用文档压缩 -->


⚡ 五、性能优化建议

  • 缓冲写入:减少 I/O 操作

    <target xsi:type="BufferingWrapper" bufferSize="1000"><target xsi:type="File" fileName="logs/buffered.log" />
    </target>
  • 按环境调整日志级别

    • 开发环境:Debug

    • 生产环境:Warn 或 Error

  • 条件日志记录:避免不必要的计算

    if (logger.IsEnabled(LogLevel.Debug)) 
    {var data = ExpensiveOperation();logger.Debug(data);
    }

    目标标签配置选项:

  • File target · NLog/NLog 数据库https://github.com/NLog/NLog/wiki/Database-target

  • File target · NLog/NLog Wiki · GitHubhttps://github.com/NLog/NLog/wiki/File-target

  • NLog 和 SQL Server 示例配置

    <target name="database" xsi:type="Database"><connectionString>server=localhost;Database=*****;user id=****;password=*****</connectionString><!--数据库中创建日志表Script for creating the dbo.Log table.SET ANSI_NULLS ONSET QUOTED_IDENTIFIER ONCREATE TABLE [dbo].[Log] ([Id] [int] IDENTITY(1,1) NOT NULL,[MachineName] [nvarchar](50) NOT NULL,[Logged] [datetime] NOT NULL,[Level] [nvarchar](50) NOT NULL,[Message] [nvarchar](max) NOT NULL,[Logger] [nvarchar](250) NULL,[Exception] [nvarchar](max) NULL,CONSTRAINT [PK_dbo.Log] PRIMARY KEY CLUSTERED ([Id] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]--><commandText>insert into dbo.Log (MachineName, Logged, Level, Message,Logger, Exception) values (@MachineName, @Logged, @Level, @Message,@Logger, @Exception);</commandText><parameter name="@MachineName" layout="${machinename}" /><parameter name="@Logged" layout="${date}" /><parameter name="@Level" layout="${level}" /><parameter name="@Message" layout="${message}" /><parameter name="@Logger" layout="${logger}" /><parameter name="@Exception" layout="${exception:tostring}" />
    </target>

    Serilog结构化日志输出

  • 官方文档:NuGet 库 |Serilog.AspNetCore 9.0.0https://www.nuget.org/packages/Serilog.AspNetCore/9.0.0
  • 安装Nuget包:
    • Serilog.AspNetCore

日志设置:

Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().MinimumLevel.Override("Microsoft", LogEventLevel.Information).Enrich.FromLogContext().WriteTo.Console()// Add this line:.WriteTo.File(//连接路径 存放位置:C:\Users\xxxxxx\LogFiles\Application\diagnostics.txtSystem.IO.Path.Combine(Environment.GetEnvironmentVariable("HOME"), "LogFiles", "Application", "diagnostics.txt"),rollingInterval: RollingInterval.Day,fileSizeLimitBytes: 10 * 1024 * 1024,retainedFileCountLimit: 2,rollOnFileSizeLimit: true,shared: true,flushToDiskInterval: TimeSpan.FromSeconds(1)).CreateLogger();//添加serilog日志对象services.AddSerilog();

完整代码:

1.安装serilog包:

       

 Install-Package  Serilog.AspNetCore

2.创建一个类,使用构造方法注入ILogger<一般填写当前类名> 

 class TestLog
{//定义一个ILogger类型私有变量,泛型中类型填写本类private readonly ILogger<TestLog> logger;//使用构造方法进行注入public TestLog(ILogger<TestLog> logger) { this.logger = logger;}public void Log(){logger.LogDebug("调试记录信息");logger.LogWarning("警告记录信息");logger.LogError("错误记录信息");}}

3.在主程序中创建DI容器,注册服务、添加serilog文本输出

public class Program
{static void Main(string[] args){//创建DI容器对象ServiceCollection services = new ServiceCollection();services.AddLogging(logBuilder => {//存放日志路径string path = System.IO.Path.Combine(Environment.GetEnvironmentVariable("HOME"), "LogFiles", "Application", "diagnostics.txt");//serilog日志的设置Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().Enrich.FromLogContext().WriteTo.Console(new JsonFormatter()).WriteTo.File(path,rollingInterval: RollingInterval.Day,fileSizeLimitBytes: 10 * 1024 * 1024,retainedFileCountLimit: 2,rollOnFileSizeLimit: true,shared: true,flushToDiskInterval: TimeSpan.FromSeconds(1)).CreateLogger();//添加serilog日志对象logBuilder.AddSerilog();//设置输出级别为最低logBuilder.SetMinimumLevel(LogLevel.Trace);  });//容器注册服务对象services.AddScoped<TestLog>();//构建一个服务提供者(Service Provider)对象//创建一个 `ServiceProvider` 实例。//-这个 `ServiceProvider` 对象就是依赖注入容器,它负责管理服务的生命周期和解析服务using (var sp = services.BuildServiceProvider()){//获取服务对象TestLog tlog =   sp.GetRequiredService<TestLog>();tlog.Log();Console.ReadKey();}}
}

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

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

相关文章

中国贸促会融媒体中心出海活动负责人、出海星球创始人莅临绿算技术

近日&#xff0c;中国贸促会融媒体中心出海活动负责人、出海星球创始人王思诺一行莅临广东省绿算技术有限公司&#xff0c;深入考察其核心技术产品与全球化布局。双方围绕绿算技术全栈产品体系、创新出海模式及生态共建展开深度对话。绿算技术作为国内智算基础设施领域的领军企…

【算法专题训练】06、数组双指针

1、数组 数组是由相同类型的元素组成的数据集合&#xff0c;并且占据一块连续的内存&#xff0c;按照顺序存储数据。 1.1、数组的特性&#xff1a; 数组元素通过下标获取数据数组对象初始化时&#xff0c;需要先指定数组容量大小&#xff0c;并根据容量大小分配内存。缺点&…

操作系统-lecture2(操作系统结构)

回顾下lecture1 swap区域不可以马上执行&#xff0c;即虚拟内存的数据和指令不可以被执行&#xff0c;得交换回到内存区域 操作系统的服务 主要提供两种服务 面向普通用户&#xff1a;user interface面向程序员&#xff1a;应用级程序代码 为用户 为用户提供了操作包括但不…

内网服务器实现从公网穿透

从6月份tplink的ddns失效之后&#xff0c;对于部分在内网运行的服务器&#xff0c;从公网访问就收到了部分影响。有好几个朋友找来&#xff0c;寻求帮助&#xff0c;看看怎么恢复原来的机制&#xff0c;可以从公网互联网访问内网服务器。方案一&#xff1a;如果有动态公网的客户…

vcs-编译+仿真+dump波形【IMP】

VCS仿真分为两步式(编译/compilation仿真/simulation)和三步式(分析/analysis细化/elaborationsimulation/仿真);注2:analysis/分析是三步式flow中仿真design的第一步&#xff0c;在此阶段将使用vhdlan或vlogan分析VHDL、Verilog、SystemVerilog和OpenVera文件。下面的部分包括…

程序代码篇---python向http界面发送数据

在 Python 中向 HTTP 界面发送数据&#xff0c;本质上是模拟用户在网页上填写表单、点击提交按钮的过程。这在自动化测试、数据上报、接口调用等场景中非常常用。下面用通俗易懂的方式介绍具体方法、实例代码和解析。核心原理网页上的数据发送&#xff08;比如提交表单&#xf…

mybatis-plus由mysql改成达梦数据库

前置条件: 达梦数据库设置了大小写敏感,我比较菜,改不动!先这么凑合着用吧; 因为设置了大小写敏感,所以所有的sql语句都要加 引号; 这样是会报错的: SELECT remark,createDept,createBy,createTime,updateBy,updateTime FROM sys_oss_config这样才可以 SELECT "create_…

设计模式:外观模式 Facade

目录前言问题解决方案结构代码前言 外观是一种结构型设计模式&#xff0c;能为程序库、框架或其他复杂类提供一个简单的接口。 问题 假设你必须在代码中使用某个复杂的库或框架中的众多对象。正常情况下&#xff0c; 你需要负责所有对象的初始化工作、 管理其依赖关系并按正确…

【数据结构初阶】--二叉树(四)

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

三、平面度检测-差值法

方法一: dev_get_window (WindowHandle) *读取3通道彩色融合图 read_image (Image, ./XYZ彩色融合图.tiff) *拆分3个通道 decompose3 (Image, x, y, z) *将3个通道图像转换为3D模型 xyz_to_object_model_3d (x,y, z, ObjectModel3D) *显示动态3D模型 threshold (z, Regions,…

什么是数据编排?数据编排的流程、优势、挑战及工具有哪些?

目录 一、数据编排的定义与概念 1.数据编排的基本含义 2.数据编排与相关概念的区别 3.数据编排的重要性 二、数据编排的流程 1.需求分析&#xff1a; 2.数据源识别与连接&#xff1a; 3.数据抽取&#xff1a; 4.数据转换&#xff1a; 5.数据加载&#xff1a; 6.监控…

【C++算法】82.BFS解决FloodFill算法_被围绕的区域

文章目录题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;题目链接&#xff1a; 130. 被围绕的区域 题目描述&#xff1a; 解法 BFS一层层剥开。 C 算法代码&#xff1a; class Solution {// 定义四个方向的偏移量&#xff1a;右、左、下、上int dx[4] …

商汤发布具身智能平台,让机器人像人一样和现实世界交互

7月27日&#xff0c;在“大爱无疆模塑未来”WAIC 2025大模型论坛上&#xff0c;商汤科技重磅发布「悟能」具身智能平台。「悟能」具身智能平台以商汤具身世界模型为核心引擎&#xff0c;依托商汤大装置提供端侧和云侧算力支持&#xff0c;能够为机器人、智能设备提供强大的感知…

MCP工作原理

在谈MCP原理前&#xff0c;我们先谈谈MCP的技术前身—Function Calling。1.Function Calling技术在FunctionCalling技术出现之前&#xff0c;大语言模型虽然拥有强大的知识储备和语言理解能力&#xff0c;但是只能提供自身数据库已有的信息&#xff0c;无法和外界进行信息交互。…

VSCode手动版本更新

技术背景 使用VSCode的的过程中&#xff0c;如果打开了自动更新功能&#xff0c;每隔一段时间就会有更新提示。为了保持版本的稳定性&#xff0c;我们可以在设置中将Update: Mode设置为none&#xff0c;这样就不会触发自动更新。但有时又有版本更新的需求&#xff0c;可能是版本…

医疗超声成像专用AFE模拟前端

医疗超声成像作为一种广泛应用于临床诊断的重要技术&#xff0c;对于提供清晰、准确的医学图像起着关键作用。在超声成像系统中&#xff0c;AFE模拟前端扮演着至关重要的角色。它负责对超声换能器接收到的微弱电信号进行处理和转换&#xff0c;为后续的数字信号处理提供高质量的…

机器学习之线性回归——小白教学

一、线性回归简介1.什么是线性回归线性回归(Linear regression)是利⽤回归⽅程(函数)对⼀个或多个⾃变量(特征值)和因变量(⽬标值)之间关系进⾏建模的⼀种分析⽅式。特点&#xff1a;只有⼀个⾃变量的情况称为单变量回归&#xff0c;多于⼀个⾃变量情况的叫做多元回归线性回…

.NET 10 中的新增功能系列文章1——运行时中的新增功能

引言 随着 .NET 10 预览版6的发布&#xff0c;微软在运行时层面带来了一系列重要的性能改进和新功能。这些改进主要集中在JIT编译器优化、硬件指令集支持、内存管理等方面&#xff0c;旨在进一步提升应用程序的执行效率和资源利用率。本文将详细解析这些运行时增强功能&#x…

安宝特方案丨AI算法能力开放平台:适用于人工装配质检、点检、实操培训

当前工业AI图形识别算法的应用存在投入成本高、维护更新难、依赖固定相机、应用范围窄、与实际作业脱节等问题。 针对以上情况&#xff0c;安宝特提出了“AI算法能力开放平台”&#xff0c;目的是让AI图形识别算法可以与现场实际的人工点检作业、装配作业、质检作业、培训作业…

水下目标识别准确率↑89%!陌讯多模态融合算法在智慧水务的落地实践

一、行业痛点&#xff1a;智慧水务的检测困境据《2024城市水务智能化白皮书》统计&#xff0c;传统水务检测面临三大挑战&#xff1a;​​水体干扰​​&#xff1a;浑浊度>100NTU时&#xff0c;目标漏检率高达65%​​动态环境​​&#xff1a;水流扰动导致目标形变&#xff…