Asp .Net Core 集成 NLog

news2024/9/20 18:48:52

简介

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.coloradmin.cn/o/1437562.html

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

相关文章

正确入市时机3秒抓住,WeTrade众汇无偿实例分享

在上篇文章中&#xff0c;WeTrade众汇无偿分享如何3秒抓住正确入市的时机&#xff0c;今天让我们通过一个例子来验证这个策略的正确性。 对于突破策略&#xff0c;WeTrade众汇用了同样的图表来演示挤压交易。蓝色箭头表示变窄的区域&#xff0c;红色箭头表示烛台穿过下层。当它…

代码随想录 Leetcode46. 全排列

题目&#xff1a; 代码&#xff08;首刷自解 2024年2月6日&#xff09;&#xff1a; class Solution { private:vector<vector<int>> res;vector<int> path; public:void backtracking(vector<int>& nums, int depth, vector<bool>& us…

三月济南举办2024第八届生物饲料高质量发展论坛

饲料工业发展空间大&#xff0c;产量持续增长&#xff0c;品质与质量也在不断提高&#xff0c;饲料工业是支撑现代畜牧水产养殖业发展的基础产业&#xff0c;是关系到城乡居民动物性食品供应的民生产业。“十四五”时期是我国由全面建设小康社会向基本实现社会主义现代化迈进的…

Python中的包模块引用成员的方法

在Python中&#xff0c;包&#xff08;package&#xff09;和模块&#xff08;module&#xff09;是组织和管理代码的重要方式。将代码分成不同的模块或包可以更好地组织代码结构&#xff0c;使代码更易于维护和管理。说的通俗点&#xff0c;就是将代码整理成一块一块&#xff…

计算机服务器中了mkp勒索病毒如何解密,mkp勒索病毒解密流程

随着网络技术的不断发展与应用&#xff0c;越来越多的企业走向数字化办公模式&#xff0c;计算机极大地方便了企业的正常生产运营&#xff0c;但网络威胁的手段也不断增加。近期&#xff0c;云天数据恢复接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mkp勒索病毒攻击…

js中的事件模型详解

文章目录 一、事件与事件流二、事件模型原始事件模型标准事件模型IE事件模型 一、事件与事件流 javascript中的事件&#xff0c;可以理解就是在HTML文档或者浏览器中发生的一种交互操作&#xff0c;使得网页具备互动性&#xff0c; 常见的有加载事件、鼠标事件、自定义事件等 …

红外避障模块

目录 一、模块原理 二、模块使用说明 三、材料准备 四、代码 五、实验效果 实验效果 自动灯效果&#xff1a; 避障模块-CSDN直播 一、模块原理 红外避障模块利用光反射原理&#xff0c;模块前端拥有一个红外发射管和一个红外接收管。模块通电后红外发射管向前方不断发射…

ES监控方法以及核心指标

文章目录 1. 监控指标采集1.1 部署elasticsearch_exporter1.2 prometheus采集elasticsearch_exporter的暴露指标1.3 promethues配置告警规则或者配置grafana大盘 2. 核心告警指标2.1 es核心指标2.2 es容量模型建议 3. 参考文章 探讨es的监控数据采集方式以及需要关注的核心指标…

Linux--文件

文件的基本信息 文件是计算机系统中存储数据的一种单位。 它可以是文本、图像、音频、视频等信息的载体。文件通常以特定的格式和拓展名来表示其内容和类型。 在计算机系统中&#xff0c;文件使用文件名来唯一标识和访问。文件可以被创建、读取、写入、复制、移动、删除等操作…

《Java程序设计》实验报告(二)之面向对象编程基础

实验内容及步骤&#xff1a; 编写不带构造函数的类并测试。&#xff08;学生类、圆类&#xff09;&#xff08;1&#xff09;代码&#xff1a; class Student { String name"张三"; int age20; String sex"男";//gender String getName(){…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之RichText组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之RichText组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、RichText组件 鸿蒙&#xff08;HarmonyOS&#xff09;富文本组件&#xff0c;…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Video媒体组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Video媒体组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Video媒体组件 用于播放视频文件并控制其播放状态的组件。 子组件 无 接口…

8.0 Zookeeper 四字命令教程详解

zookeeper 支持某些特定的四字命令与其交互&#xff0c;用户获取 zookeeper 服务的当前状态及相关信息&#xff0c;用户在客户端可以通过 telenet 或者 nc&#xff08;netcat&#xff09; 向 zookeeper 提交相应的命令。 安装 nc 命令&#xff1a; $ yum install nc …

国密SM2算法进行数据的加密、签名和验签、解密

一、背景介绍 数据的加解密有很多种方式&#xff0c;几种常用的加密算法如下&#xff1a; DES&#xff08;Data Encryption Standard&#xff09;&#xff1a;对称算法&#xff0c;数据加密标准&#xff0c;速度较快&#xff0c;适用于加密大量数据的场合&#xff1b; 3DES&…

黄金交易策略:heiken ashi smoothed与macd快慢指标协同工作

第2点应该是有很大的优化空间 推荐阅读&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客

【chromium】windows构建base库 3:gn + vs2022 args 设置及debug x86 构建

GN 构建配置GN 构建配置 此页面提供了 GN 构建的一些常见构建设置。它假设您已经获得了 Chromium checkout。 也可以看看 从命令行运行“gn help”。 所有 GN 文档 GN 快速入门指南 GN 参考 (一个网页中“gn help”中所有内容的转储)。 了解 GN 构建标志 回想一下,在 GN …

Redis(02)——事务管理

事务概念 Redis事务的本质是一组命令的集合。事务支持一次执行多个命令&#xff0c;一个事务中所有命令都会被序列化&#xff0c;在事务执行过程中&#xff0c;会按照顺序串行化执行队列中的命令&#xff0c;其他客户端提交的命令请求不会插入到事务执行命令序列中 Redis事务…

QT设置qss

Qt设置qss文件&#xff08;设置在qrc中&#xff09; 1、右击项目选择添加新文件 2、在弹出的对话框中选择Qt -> Qt Resource File 3、随便起一个名称 4、在代码路径下新建一个stylesheet.qss文件&#xff0c;随便写入一些样式 5、右击resources.qrc&#xff0c;选择添加…

go modules使用

创建项目 在使用GoLand创建项目的时候&#xff0c;会自动创建对应的go.mod文件。 创建完后 创建文件 创建一个main.go的文件&#xff0c;里面print一个hello world。 在运行时可以设置是否采取先生成文件再运行。 为空的话则不输出。 下面的Environment为设置运行的环境…

数据恢复软件应该怎么选?看这篇就够了

存储数据的选择有很多&#xff0c;例如计算机硬盘、智能手机、平板电脑、闪存驱动器和存储卡。然而&#xff0c;所有这些都可能在某个时刻失败。我们当中谁没有不小心删除过重要的文档或照片&#xff1f; 如果最坏的情况发生&#xff0c;仍然有希望。一种选择是聘请数据恢复服…