Asp .Net Core 系列:Asp .Net Core 集成 NLog

news2025/1/24 5:07:25

简介

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

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

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

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

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

官网:https://nlog-project.org/

github:https://github.com/nlog/nlog/

配置文件说明:https://github.com/NLog/NLog/wiki/Configuration-file#

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

系统变量参考:https://nlog-project.org/config/?tab=layout-renderers

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

参考:https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-6

  1. 安装 NLog.Web.AspNetCore 包

    在您的项目中,通过 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数据库

https://github.com/NLog/NLog/wiki/Database-target

安装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: https://www.nuget.org/packages/MySql.Data/

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

or if using packages: https://www.nuget.org/packages/MySqlConnector/ and https://www.nuget.org/packages/MySqlConnector.Logging.NLog/

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

Install package: https://www.nuget.org/packages/System.Data.SQLite

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

Install package: https://www.nuget.org/packages/Microsoft.Data.SqlClient/

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

Install package: https://www.nuget.org/packages/Microsoft.Data.SQLite/

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

Install package: https://www.nuget.org/packages/Npgsql/

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"

记录故障排除

有时我们的应用程序不会向日志文件写入任何内容,即使我们应该正确配置了日志记录。日志未写入的原因可能有很多。最常见的问题是权限问题,通常在 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.coloradmin.cn/o/1446291.html

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

相关文章

三、案例 - MySQL数据迁移至ClickHouse

MySQL数据迁移至ClickHouse 一、生成测试数据表和数据1.在MySQL创建数据表和数据2.在ClickHouse创建数据表 二、生成模板文件1.模板文件内容2.模板文件参数详解2.1 全局设置2.2 数据读取&#xff08;Reader&#xff09;2.3 数据写入&#xff08;Writer&#xff09;2.4 性能设置…

ctfshow-文件上传(web151-web161)

目录 web151 web152 web153 web154 web155 web156 web157 web158 web159 web160 web161 web151 提示前台验证不可靠 那限制条件估计就是在前端设置的 上传php小马后 弹出了窗口说不支持的格式 查看源码 这一条很关键 这种不懂直接ai搜 意思就是限制了上传类型 允许…

计算机组成原理 1 概论

主要内容 介绍运算器、控制器、存储器结构、工作原理、设计方法及互连构成整机的技术。 主要内容&#xff1a; ◼ 数值表示与运算方法 ◼ 运算器的功能、组成和基本运行原理 ◼ 存储器及层次存储系统 ◼ 指令系统 ◼ CPU功能、组成和运行原理 ◼ 流水线 ◼ 系统总线 ◼ 输入输出…

UE5 播放本地MP3、MP4

1.创建一个媒体播放器 2.如创建视频&#xff0c;勾选。 它会多一个媒体纹理给你 3.1 设置音频 在一个actor上添加“媒体音频组件” “音频媒体播放器”赋值给它 3.2播放音频 添加一个音频媒体播放器变量&#xff0c; 赋值 地址使用绝对地址 4.1设置视频 UI上创建一个imag…

快速学习Spring

Spring 简介 Spring 是一个开源的轻量级、非侵入式的 JavaEE 框架&#xff0c;它为企业级 Java 应用提供了全面的基础设施支持。Spring 的设计目标是简化企业应用的开发&#xff0c;并解决 Java 开发中常见的复杂性和低效率问题。 Spring常用依赖 <dependencies><!-…

Linux:信号的处理

文章目录 信号处理 本篇总结的是关于信号的处理 信号处理 在之前有这样的观点&#xff1a;信号在合适的时候被处理好&#xff0c;当进程收到信号后&#xff0c;当前进程可能在做优先级更高的事&#xff0c;所以它来不及处理这个信号&#xff0c;那么就会把这个信号暂时保存起…

spring aop @annotation的用法

直接看原文: spring aop annotation的用法-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- annotation用在定义连接点时&#xff0c;对连接点进行限制。比如我们想对标注了…

双非本科准备秋招(18.2)—— 图解Monitor

对象头 普通对象&#xff1a; 数组对象&#xff1a; java中对象存储结构分为对象头&#xff08;Header&#xff09;、实例数据&#xff08;Instance Date&#xff09;和对齐填充&#xff08;Padding&#xff09;。 对象头存储着Mark Word和Klass Word&#xff0c;通过Klass Wo…

【MySQL】操作库 —— 库的操作 -- 详解

一、增删数据库 1、创建数据库 create database db_name; 本质就是在 /var/lib/mysql 创建一个目录。 说明&#xff1a; 大写的表示关键字。[ ] 是可选项。CHARACTER SET&#xff1a;指定数据库采用的字符集。COLLATE&#xff1a;指定数据库字符集的校验规则。 2、数据库删除…

背包问题(理论)

对于面试的话&#xff0c;掌握01背包、完全背包&#xff0c;就够用了&#xff0c;最多可以再来一个多重背包。 至于背包九讲其他背包&#xff0c;面试几乎不会问&#xff0c;都是竞赛级别的了&#xff0c;leetcode上连多重背包的题目都没有&#xff0c;所以题库也告诉我们&…

NodeJS安装(windows)

NodeJS安装&#xff08;windows&#xff09; 1、官网地址 NodeJS官网地址&#xff1a;https://nodejs.org/en 2、安装 3、验证NodeJS环境变量 cmd后&#xff0c;运行&#xff1a;node -v 4、配置npm的全局安装路径&#xff08;需要管理员身份运行&#xff09; npm conf…

【后端高频面试题--设计模式上篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 什么是设计模式&#xff1f;怎么理解设计模式&#xff1f; 设计模式是在软件设计中&#xff0c…

三.AV Foundation 视频播放 - 播放控制

引言 前面的博客我们已经实现了视频的播放功能&#xff0c;但是作为一个完整的视频播放器仅仅有播放功能是不够的&#xff0c;暂停&#xff0c;快进&#xff0c;播放进度条&#xff0c;显示播放时间&#xff0c;显示视频标题和字幕都是必不可少的功能。 本篇博客我们就对视频…

Spring Cloud Gateway 网关路由

一、路由断言 路由断言就是判断路由转发的规则 二、路由过滤器 1. 路由过滤器可以实现对网关请求的处理&#xff0c;可以使用 Gateway 提供的&#xff0c;也可以自定义过滤器 2. 路由过滤器 GatewayFilter&#xff08;默认不生效&#xff0c;只有配置到路由后才会生效&#x…

【原创 附源码】Flutter安卓及iOS海外登录--Apple登录最详细流程

最近接触了几个海外登录的平台&#xff0c;踩了很多坑&#xff0c;也总结了很多东西&#xff0c;决定记录下来给路过的兄弟坐个参考&#xff0c;也留着以后留着回顾。更新时间为2024年2月12日&#xff0c;后续集成方式可能会有变动&#xff0c;所以目前的集成流程仅供参考&…

【GameFramework框架内置模块】1、全局配置(Config)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

AtCoder Beginner Contest 340(A-G)

A - Arithmetic Progression (atcoder.jp) 1.思路&#xff1a;循环输出即可 2.代码&#xff1a; #include <bits/stdc.h> #define rep(i,z,n) for(int i z;i < n; i) #define per(i,n,z) for(int i n;i > z; i--) #define PII pair<int,int> #define fi f…

【51单片机】串口(江科大)

8.1串口通信 1.串口介绍 2.硬件电路 3.电平标准 电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种: 电平标准是数据1和数据O的表达方式,是传输线缆中人为规定的电 压与数据的对应关系,串口常用的电平标准有如下…

Microsoft Excel 加载数据分析工具

Microsoft Excel 加载数据分析工具 1. 打开 Excel&#xff0c;文件 -> 选项2. 加载项 -> 转到…3. 分析工具库、分析工具库 - VBA4. 打开 Excel&#xff0c;数据 -> 数据分析References 1. 打开 Excel&#xff0c;文件 -> 选项 2. 加载项 -> 转到… ​​​ 3…

2013-2022年上市公司迪博内部控制指数、内部控制分项指数数据

2013-2022年上市公司迪博内部控制指数、分项指数数据 1、时间&#xff1a;2013-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、辖区、证监会行业、申万行业、内部控制指数、战略层级指数、经营层级指数、报告可靠指数、合法合规指数、资产安全…