Asp .Net Core 集成 NLog

简介

NLog是一个基于.NET平台编写的日志记录类库,它可以在应用程序中添加跟踪调试代码,以便在开发、测试和生产环境中对程序进行监控和故障排除。NLog具有简单、灵活和易于配置的特点,支持在任何一种.NET语言中输出带有上下文的调试诊断信息,并能够将这些信息发送到一个或多个输出目标(target)中,如文件、数据库、控制台等。

NLog的API非常类似于log4net,但配置方式更加简单,使用路由表(routing table)进行配置,使得配置文件易于阅读和维护。此外,NLog还支持结构化日志记录,可以方便地记录复杂的数据类型,如对象、集合等。它还提供了可扩展性,允许用户编写自定义目标或传递自定义值,以满足特定的日志记录需求。

NLog支持多种平台,包括.NET Framework、.NET Core、Xamarin、ASP.NET等,可以在各种应用程序中使用。同时,NLog还遵从BSD license,允许商业应用且完全开放源代码,因此得到了广泛的应用和支持。

NLog 支持结构化日志 记录和传统日志记录。

NLog的重点是:高性能、易于使用、易于扩展和灵活配置

 

NLog配置文件说明

文件位置

启动时,NLog 在各种文件中搜索其配置,如下所述。它加载找到的第一个 nlog 配置。当找到第一个 nlog 配置时,搜索结束。如果未找到配置,NLog 将不会执行任何日志记录。

对于独立的 *.exe 应用程序,按如下方式搜索文件:

  • 标准应用程序配置文件 app.config(例如 applicationname.exe.config)
  • 应用程序目录中的 applicationname.exe.nlog
  • 应用程序目录中的 NLog.config
  • NLog.dll.nlog 位于 NLog.dll 所在目录中(仅当 NLog 未安装在 GAC 中时)

对于 ASP.NET 应用程序,按如下方式搜索文件:

  • 标准 Web 应用程序配置文件 web.config
  • web.nlog 与 web.config 位于同一目录
  • 应用程序目录中的 NLog.config
  • NLog.dll.nlog 位于 NLog.dll 所在目录中(仅当 NLog 未安装在 GAC 中时)

另请参阅显式 NLog 配置加载(包括有关assetsXamarin Android 的 -folder 的详细信息)

元素说明

您可以使用以下元素作为 的子元素nlogtargetsrules在任何配置中都是必需的 其他是可选的,并且在高级场景中很有用。

  • targets– 定义日志目标/输出
  • rules– 定义日志路由规则
  • extensions– 从 *.dll 文件加载 NLog 扩展
  • include– 包括外部配置文件
  • variable– 设置配置变量的值
Targets:定义日志目标/输出
<targets>
    <target name="f"
            xsi:type="File"
            fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" 
            maxArchiveFiles="5"
            archiveAboveSize="10240"
            archiveEvery="Day"/>
</targets>0

Nlog允许用户配置单个文件大小, 放置在内容过长效率过慢,配置了大小之后, Nlog会自动创建一个新的文件副本,插入新的日志输出。

maxArchiveFiles:允许生成的副本文件最大数量

archiveAboveSize:允许单个文件得最大容量

archiveEvery:按天生成

name:输出目标的名称,用于rules中路由规则writeTo指定

fileName:包含完整的生成文件的路径和文件名

xsi:type:输出类型如下

Chainsaw
ColoredConsole 
Console
Database
Debug
Debugger
EventLog
File
LogReceiverService
Mail
Memory
MethodCall
Network
NLogViewer
Null
OutputDebugString
PerfCounter
Trace
WebService

layout:用来规定输出内容格式,语法“${属性}”,可以把上下文信息插入到日志中。

系统变量参考:Config | NLog

Rules– 定义日志路由规则

路由顺序会对日志打印产生影响。路由匹配逻辑为顺序匹配。

日志可以分不同级别进行输出,日志规则rules里面可以控制输出的日志级别。不同级别的日志代表日志的重要程度,比如一些debug级别的日志在生产环境就会被控制不输出,以减少日志文件的大小。

<rules>
    <logger name="*" minlevel="Debug" writeTo="file" />
</rules>name:记录者的名字。
  • ame– 匹配记录器对象的记录器名称 - 可能包含通配符(* 和 ?)
  • minlevel– 记录的最低级别(与指定级别和上面的级别匹配)
  • maxlevel– 记录的最大级别(与指定级别和下面的级别匹配)
  • level– 单级记录
  • levels- 以逗号分隔的要记录的级别列表
  • writeTo– 以逗号分隔的要写入的目标列表
  • final– 最终规则匹配后不处理任何规则
  • enabled- 设置为false禁用规则而不删除它
  • ruleName- 允许使用 Configuration.FindRuleByName和进行规则查找的规则标识符Configuration.RemoveRuleByName。NLog 4.6.4 中引入
  • FinalMinLevel - 记录器匹配将被限制为以下规则的指定最低级别。NLog 5.0中引入

日志级别有如下,自上而下,等级递增。

  • Trace - 最常见的记录信息,一般用于普通输出
  • Debug - 同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序
  • Info - 信息类型的消息
  • Warn - 警告信息,一般用于比较重要的场合
  • Error - 错误信息
  • Fatal - 致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行。

日志过滤器:可以在路由当中, 为每个路由配置自定义得日志过滤器fliter,如下所示

<rules>
    <logger name="*" writeTo="file">
        <filters>
            <when condition="length('${message}') > 100" action="Ignore" />
            <when condition="equals('${logger}','MyApps.SomeClass')" action="Ignore" />
            <when condition="(level >= LogLevel.Debug and contains('${message}','PleaseDontLogThis'))" action="Ignore" />
            <when condition="not starts-with('${message}','PleaseLogThis')" action="Ignore" />
        </filters>
    </logger>
</rules>

Asp .Net Core 集成 NLog

安装 NLog.Web.AspNetCore 包

  1. 在您的项目中,通过 NuGet 包管理器安装 NLog.Web.AspNetCore 包。在 Visual Studio 中,您可以右键点击项目 -> 选择 "Manage NuGet Packages" -> 搜索 NLog.Web.AspNetCore -> 点击 "Install"。

    或者通过命令行安装:

    dotnet add package NLog.Web.AspNetCore
    
  2. 配置 NLog

    创建一个 nlog.config 文件在项目的根目录下,并添加您的 NLog 配置。例如:

<?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"  
      autoReload="true"  
      throwExceptions="false"  
      internalLogLevel="Info" internalLogFile="internal-nlog.txt">  

    <!-- 定义日志输出目标 -->  
    <targets>  
      <target xsi:type="File" name="file" fileName="${basedir}/logs/nlog.txt"  
              layout="${longdate} ${level:uppercase=true} ${message} ${exception}" />  
    </targets>  

    <!-- 定义日志规则 -->  
    <rules>  
      <logger name="*" minlevel="Debug" writeTo="file" />  
    </rules>  
</nlog>
  1. 在 Program.cs 中配置 NLog

    // 添加 NLog  
    builder.Logging.ClearProviders();  
    //builder.Logging.SetMinimumLevel(LogLevel.Debug);  
    //NLogBuilder.ConfigureNLog("nlog.config");  
    builder.Host.UseNLog(); 
    
  2. 使用 NLog

    现在您可以在控制器、服务等中注入 ILogger 并使用它记录日志。NLog 将处理这些日志并记录到配置的目标中。

    using Microsoft.AspNetCore.Mvc;
    
    namespace NLogTest.Controllers
    {
        [ApiController]
        [Route("[controller]")]
        public class WeatherForecastController : ControllerBase
        {
            private readonly ILogger<WeatherForecastController> _logger;
    
            public WeatherForecastController(ILogger<WeatherForecastController> logger)
            {
                _logger = logger;
            }
    
            [HttpGet(Name = "GetWeatherForecast")]
            public IEnumerable<WeatherForecast> Get()
            {
                try
                {           
                    int a = 1 / int.Parse("0");
                    return null;
                }
                catch (Exception ex)
                {
                    _logger.LogDebug(ex, ex.Message);
                    _logger.LogTrace(ex, ex.Message);
                    _logger.LogInformation(ex, ex.Message);
                    _logger.LogWarning(ex, ex.Message);
                    _logger.LogError(ex, ex.Message);
                    return Enumerable.Empty<WeatherForecast>();
                }
            }
        }
    }
    
    

NLog 自定义全局变量

            app.Use(async (context, next) =>
            {
                GlobalDiagnosticsContext.Set("TenantId", 1);
                GlobalDiagnosticsContext.Set("CreateUserId", 111);
                await next();
            });

// 使用
${gdc:TenantId}

将日志消息写入MySQL数据库

Database target · NLog/NLog Wiki · GitHub

安装Nuget包

dotnet add package NLog.Database
dotnet add package MySql.Data

数据库准备(MySQL)

create database mcode_log;
use mcode_log;
create table if not exists erp_log
(
    Id              bigint auto_increment comment '主键'
        primary key,
    TenantId        bigint       null comment '租户Id',
    ApplicationName varchar(100) null comment '程序名称',
    HostName        varchar(100) null comment '主机',
    Ip              varchar(100) null comment 'Ip地址',
    Message         text         null comment '信息',
    Level           varchar(50)  null comment '级别',
    ExceptionInfo   text         null comment '异常信息',
    CallInfo        text         null comment '调用信息',
    RequestMethod   varchar(20)  null comment '请求方法',
    RequestUrl      varchar(512) null comment '请求地址',
    RequestBody     text         null comment '请求主体',
    CreateTime      datetime     null comment '创建时间',
    CreateUserId    bigint       null comment '创建用户',
    CreateUserName  varchar(50)  null comment '创建用户名称'
);

配置NLog

<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      autoReload="true"
      throwExceptions="false" 
      throwConfigExceptions="true"
      internalLogLevel="warn"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<!--生产环境 throwExceptions 建议为false -->
	<extensions>
		<add assembly="NLog.Web.AspNetCore"/>
		<add assembly="NLog.Database"/>
	</extensions>
	<!--internalLogFile="logfiles"-->
	<targets async="true">
		<!--屏幕打印消息-->
		<target name="console" xsi:type="ColoredConsole"
						layout="${newline}=======================================================================
                            ${newline} 【当前时间】: [${date:format=yyyy-MM-dd HH\:mm\:ss}]                           
                            ${newline} 【 级 别 】:[${level}]                            
                            ${newline} 【 调 用 】:[${callsite}] [${callsite-linenumber}] [${callsite-filename}] [${stacktrace}]                                                            
                            ${newline} 【 消 息 】:[${message}]   
                            ${newline} 【 异 常 】:[${exception:format=ToString}] [${threadname}] [${threadid}]
                            " />

		<!--VS输出窗口-->
		<target name="debugger" xsi:type="Debugger"
						 layout="${newline}=======================================================================
                            ${newline} 【当前时间】: [${date:format=yyyy-MM-dd HH\:mm\:ss}]                           
                            ${newline} 【 级 别 】:[${level}]                            
                            ${newline} 【 调 用 】:[${callsite}] [${callsite-linenumber}] [${callsite-filename}] [${stacktrace}]                                                            
                            ${newline} 【 消 息 】:[${message}]   
                            ${newline} 【 异 常 】:[${exception:format=ToString}] [${threadname}] [${threadid}]
                            " />

		<!--保存至文件-->
		<target name="info" xsi:type="File" maxArchiveFiles="30"
						fileName="${basedir}/Logs/Info/${shortdate}.txt"
						 layout="${newline}=======================================================================
                             ${newline} 【当前时间】: [${date:format=yyyy-MM-dd HH\:mm\:ss}]                           
                            ${newline} 【 级 别 】:[${level}]                            
                            ${newline} 【 调 用 】:[${callsite}] [${callsite-linenumber}] [${callsite-filename}] [${stacktrace}]                                                            
                            ${newline} 【 消 息 】:[${message}]   
                            ${newline} 【 异 常 】:[${exception:format=ToString}] [${threadname}] [${threadid}]
                            " />

		<!--保存至文件-->
		<target name="error" xsi:type="File" maxArchiveFiles="30"
						fileName="${basedir}/Logs/Error/${shortdate}.txt"
						layout="${newline}=======================================================================
                            ${newline} 【当前时间】: [${date:format=yyyy-MM-dd HH\:mm\:ss}]                           
                            ${newline} 【 级 别 】:[${level}]                            
                            ${newline} 【 调 用 】:[${callsite}] [${callsite-linenumber}] [${callsite-filename}] [${stacktrace}]                                                            
                            ${newline} 【 消 息 】:[${message}]   
                            ${newline} 【 异 常 】:[${exception:format=ToString}] [${threadname}] [${threadid}]
                            " />
		<!--写入数据库-->
		<target xsi:type="Null" name="blackhole"/>
		<target name="database" xsi:type="Database"
			   dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"
			  connectionString="server=110.41.14.13;Database=mcode_log;user id=root;password=123456;SslMode=none">
		<!--<target name="database" xsi:type="Database"
			  dbProvider="MySqlConnector.MySqlConnection, MySqlConnector"
			  connectionString="server=127.0.0.1;Database=mcode_log;user id=root;password=123456;SslMode=none">-->
			<commandText>
				insert into erp_log (TenantId, ApplicationName, HostName, Ip, Message, Level, ExceptionInfo, CallInfo,
				RequestMethod, RequestUrl, RequestBody, CreateTime, CreateUserId, CreateUserName)
				values (@TenantId,@ApplicationName,@HostName,@Ip,@Message,@Level,@ExceptionInfo,@CallInfo,@RequestMethod,@RequestUrl,@RequestBody,@CreateTime,@CreateUserId,@CreateUserName);
			</commandText>
			<!--注意:对于非字符串,要指定dbType"-->
			<parameter name="@TenantId" layout="${gdc:TenantId}"  dbType="DbType.Int64" />
			<parameter name="@ApplicationName" layout="${gdc:ApplicationName}"   />
			<parameter name="@HostName" layout="${hostname}" />
			<parameter name="@Ip" layout="${gdc:Ip}" />
			<parameter name="@Message" layout="${message}" />
			<parameter name="@Level" layout="${level}" />
			<parameter name="@ExceptionInfo" layout="[${exception:format=ToString}] [${threadname}] [${threadid}]" />
			<parameter name="@CallInfo" layout="[${callsite}] [${callsite-linenumber}] [${callsite-filename}] [${stacktrace}]" />
			<parameter name="@RequestMethod" layout="${gdc:RequestMethod}" />
			<parameter name="@RequestUrl" layout="${gdc:RequestUrl}" />
			<parameter name="@RequestBody" layout="${gdc:RequestBody}" />
			<parameter name="@CreateTime" layout="${date}"  dbType="DbType.DateTime" />
			<parameter name="@CreateUserId" layout="${gdc:CreateUserId}" dbType="DbType.Int64" />
			<parameter name="@CreateUserName" layout="${gdc:CreateUserName}" />
		</target>
	</targets>

	<!--规则-->
	<rules>
		<logger name="*" minlevel="Warn" writeTo="console" />
		<logger name="NLogTest.*" minlevel="Debug"  writeTo="debugger" />
		<logger name="NLogTest.*" minlevel="Info" maxlevel="Info"  writeTo="info" />
		<logger name="*" minlevel="Warn" writeTo="error" />
		<logger name="NLogTest.*" minlevel="Warn" writeTo="database" />
	</rules>
</nlog>

在这里插入图片描述
在这里插入图片描述

其它数据库

MySql and .NET Core

Install package: NuGet Gallery | MySql.Data 8.3.0

dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"

or if using packages: NuGet Gallery | MySqlConnector 2.3.5 and NuGet Gallery | MySqlConnector.Logging.NLog 2.0.0

dbProvider="MySqlConnector.MySqlConnection, MySqlConnector"
System.Data.SQLite and .NET Core

Install package: NuGet Gallery | System.Data.SQLite 1.0.118

dbProvider="System.Data.SQLite.SQLiteConnection, System.Data.SQLite"
Microsoft.Data.SqlClient and .NET Core

Install package: NuGet Gallery | Microsoft.Data.SqlClient 5.1.5

dbProvider="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient"
Microsoft.Data.Sqlite and .NET Core

Install package: NuGet Gallery | Microsoft.Data.Sqlite 8.0.1

dbProvider="Microsoft.Data.Sqlite.SqliteConnection, Microsoft.Data.Sqlite"
Npgsql and .NET core

Install package: NuGet Gallery | Npgsql 8.0.1

dbProvider="Npgsql.NpgsqlConnection, Npgsql"
Oracle.ManagedDataAccess and .NET
dbProvider="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess"
Mono.Data.Sqlite and .NET
dbProvider="Mono.Data.Sqlite.SqliteConnection, Mono.Data.Sqlite"

INI 复制 全屏

记录故障排除

有时我们的应用程序不会向日志文件写入任何内容,即使我们应该正确配置了日志记录。日志未写入的原因可能有很多。最常见的问题是权限问题,通常在 ASP.NET 进程中,其中aspnet_wp.exew3wp.exe进程可能没有对我们要存储日志的目录的写访问权限。

NLog 旨在吞掉日志记录可能导致的运行时异常。以下设置可以更改此行为和/或重定向这些消息。

  • <nlog throwExceptions="true" />-throwExceptions在配置文件中添加该属性会导致 NLog 停止屏蔽异常并将其传递给调用应用程序。该属性在部署时非常有用,可以快速定位任何问题。至关重要的是,一旦应用程序正确配置throwExceptions"false"运行,就应立即进行配置,这样意外的日志记录问题就不会导致应用程序挂起或崩溃。
  • <nlog throwConfigExceptions="true" /> - 类似于throwExceptions但仅与配置异常隔离。与此不同的是throwExceptions,启用它并不危险,建议在生产环境中启用,因为在生产环境中,日志记录配置的初始设置成功至关重要。NLog 4.3 中引入。默认null(表示未配置,而是使用 的值throwExceptions
  • <nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" />– 确定内部日志级别。级别越高,内部日志输出越不详细。当需要诊断日志记录问题时,输出通常非常有帮助。有关设置输出到文件或控制台的选项,请参阅内部日志记录。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

相机图像质量研究(3)图像质量测试介绍

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

用python编写爬虫,爬取房产信息

题目 报告要求 工程报告链接放在这里 https://download.csdn.net/download/Samature/88816284使用 1.安装jupyter notebook 2.用jupyter notebook打开工程里的ipynb文件&#xff0c;再run all就行 注意事项 可能遇到的bug 暂无&#xff0c;有的话私信我

Kafka 生产调优

Kafka生产调优 文章目录 Kafka生产调优一、Kafka 硬件配置选择场景说明服务器台数选择磁盘选择内存选择CPU选择 二、Kafka Broker调优Broker 核心参数配置服役新节点/退役旧节点增加副本因子调整分区副本存储 三、Kafka 生产者调优生产者如何提高吞吐量数据可靠性数据去重数据乱…

智慧城市:打造低碳未来,引领城市数字化转型新篇章

在“万物皆可数字化”的新时代浪潮下&#xff0c;智慧城市作为未来城市发展的先锋方向&#xff0c;正在以前所未有的速度和规模重塑我们的城市面貌。 智慧城市不仅是一个技术革新的标志&#xff0c;更是城市治理、民生服务等领域全面升级的重要引擎。 一、智慧城市的多元应用领…

Bootstrap5 导航组件和面包屑

Bootstrap5 导航组件和面包屑 Bootstrap5 提供了一种简单快捷的方法来创建基本导航&#xff0c;它提供了非常灵活和优雅的选项卡和Pills等组件。 Bootstrap5 的所有导航组件&#xff0c;包括选项卡和Pills&#xff0c;都通过基本的 .nav 类共享相同的基本标记和样式。 使用 B…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(六)NodeJS入门——http模块

047_http模块_获取请求行和请求头 hello&#xff0c;大家好&#xff0c;那第二节我们来介绍一下如何在这个服务当中来提取 HTT 请求报文的相关内容。首先先说一下关于报文的提取的方法&#xff0c;我在这个文档当中都已经记录好了&#xff0c;方便大家后续做一个快速的查阅。 …

springboot集成easypoi导出多sheet页

pom文件 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version> </dependency> 导出模板&#xff1a; 后端代码示例&#xff1a; /*** 导出加油卡进便利店大额审批列…

洛谷_P1464 Function_python写法

目录 1.错误解法 2.学习记忆化搜索算法 2.1简介 2.2案例学习 3.解法 4.总结 1.错误解法 a 0 b 0 c 0 def w(a,b,c):if a<0 or b<0 or c<0:return 1elif a>20 or b>20 or c>20:return w(20,20,20)elif a<b and b<c:return w(a-1,b,c) w(a-1,…

Python程序员面试题精选及解析(2)

本文精心挑选了10道Python程序员面试题&#xff0c;覆盖了Python的多个核心领域&#xff0c;包括装饰器、lambda函数、列表推导式、生成器、全局解释器锁(GIL)、单例模式以及上下文管理器等。每道题都附有简洁的代码示例&#xff0c;帮助读者更好地理解和应用相关知识点无论是对…

小白代码审计入门

最近小白一直在学习代码审计,对于我这个没有代码审计的菜鸟来说确实是一件无比艰难的事情。但是着恰恰应了一句老话:万事开头难。但是小白我会坚持下去。何况现在已经喜欢上了代码审计,下面呢小白就说一下appcms后台模板Getshell以及读取任意文件,影响的版本是2.0.101版本。…

【数据分享】1929-2023年全球站点的逐月平均降水量(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;说到常用的降水数据&#xff0c;最详细的降水数据是具体到气象监测站点的降水数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全…

基于spring cloud alibaba的微服务平台架构规划

平台基础能力规划&#xff08;继续完善更新…&#xff09; 一、统一网关服务&#xff08;独立服务&#xff09; 二、统一登录鉴权系统管理&#xff08;独立服务&#xff09; 1.统一登录 2.统一鉴权 3.身份管理 用户管理 角色管理 业务系统和菜单管理 部门管理 岗位管理 字典管…

【代码随想录24】93.复原 IP 地址 78.子集 90.子集II

目录 93.复原IP地址题目描述参考代码 78.子集题目描述参考代码 90.子集II题目描述参考代码 93.复原IP地址 题目描述 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如…

Java设计模式大全:23种常见的设计模式详解(三)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

VitePress-11-静态资源引入- public目录的使用

作用简述 public目录就是一个存放静态资源的目录。 项目中可以通过【绝对路径】的方式进行引入。 具体的格式请继续阅读本文剩下的内容。 知识补充-源目录(比较重要) 源目录 的概念 &#xff1a; 是markdown源文件所在的位置。 默认情况下&#xff0c;源目录与项目的根目录保持…

警惕“中等数字化陷阱”,大力发扬先进基础设施“长板”

上世纪七、八十年代&#xff0c;拉美国家发展由富转穷&#xff0c;人均GDP发展至3000美金左右就开始停滞不前。研究界将这一现象归结为一个极具争议的概念——“中等收入陷阱”。 如今&#xff0c;在我国数字化发展当中&#xff0c;也有一种“中等数字化陷阱”正露出苗头&…

读千脑智能笔记06_人工智能的未来(上)

1. 人工智能正在经历一场复兴&#xff0c;这是科技界最热门的领域之一 1.1. 大多数科学进步都建立在被广泛接受的理论框架之上。这种理论框架称为“科学范式” 1.2. 人工智能的未来将与大多数人工智能从业者如今的设想存在本质上的不同 1.3. 人工神经网络与人类大脑中的神经…

Swift Combine 从入门到精通一

1. Combine 简介 用 Apple 官方的话来说&#xff0c;Combine 是: a declarative Swift API for processing values over time. Combine 是 Apple 用来实现函数响应式编程的库&#xff0c; 类似于 RxSwift。 RxSwift 是 ReactiveX 对 Swift 语言的实现。 Combine 使用了许多可以…

uniapp canvas游标卡尺效果

效果 根据公司业务仿照写的效果。原项目从微信小程序转uniapp,未测试该效果在android端效果。 uniapp直接使用canvas不可做子组件,否则无效果显示,其次显示时要考虑页面渲染超时的问题。 如效果所见,可以设置取值精度。 gitee地址:project_practice: 项目练习 - Gitee.…

Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用

一、前言 之前在做倍速这个功能的时候&#xff0c;发现快速播放会有滴滴滴的破音出现&#xff0c;正常1倍速没有这个问题&#xff0c;尽管这个破音间隔很短&#xff0c;要放大音量才能听到&#xff0c;但是总归是不完美的&#xff0c;后面发现&#xff0c;通过修改qaudiooutpu…