游戏网站外链建设品牌营销策略分析论文

pingmian/2026/1/26 17:35:41/文章来源:
游戏网站外链建设,品牌营销策略分析论文,信息港官网,wordpress 安装 windows0x01业务描述 说明: 同事搭建的业务系统,最开始使用 log4net 记录到本地日志. 然后多个项目为了日志统一,全部记录在 Elasticsearch ,使用 log4net.ElasticSearchAppender.DotNetCore. 然后搭建了 Kibanal 对 Elasticsearch 进行查询. 但是项目组开发人员众多,不是每个人…0x01业务描述 说明: 同事搭建的业务系统,最开始使用 log4net  记录到本地日志. 然后多个项目为了日志统一,全部记录在 Elasticsearch ,使用  log4net.ElasticSearchAppender.DotNetCore. 然后搭建了 Kibanal  对 Elasticsearch  进行查询.  但是项目组开发人员众多,不是每个人都想要学会如何在 Kibanal   中查询日志.  所以 就需要开发一个  有针对性的, 查询用户界面.  最近这个功能就交到我手上了. 方案是: 通过 NEST  查询  Elasticsearch   的接口,  将前端页面传过来的参数, 组装成 NEST 的查询请求. 0x02主要实现代码 日志索引为:  xxxapilog_*  时间关键字段为:  timestamp 1 /// summary2 /// 根据查询条件,封装请求3 /// /summary4 /// param namequery/param5 /// returns/returns6 public async TaskISearchResponseDictionarystring, object GetSearchResponse(API_Query query)7 {8 int size query.PageSize;9 int from (query.PageIndex - 1) * size; 10 ISearchResponseDictionarystring, object searchResponse1 await elasticClient.SearchAsyncDictionarystring, object(searchDescriptor 11 { 12 Field sortField new Field(timestamp); 13 return searchDescriptor.Index(xxxapilog_*) 14 .Query(queryContainerDescriptor 15 { 16 return queryContainerDescriptor.Bool(boolQueryDescriptor 17 { 18 IListFuncQueryContainerDescriptorDictionarystring, object, QueryContainer queryContainers new ListFuncQueryContainerDescriptorDictionarystring, object, QueryContainer(); 19 20 if (!string.IsNullOrEmpty(query.Level)) 21 { 22 queryContainers.Add(queryContainerDescriptor 23 { 24 return queryContainerDescriptor.Term(c c.Field(Level).Value(query.Level.ToLower())); 25 }); 26 } 27 if (query.QueryStartTime.Year2020) 28 { 29 queryContainers.Add(queryContainerDescriptor 30 { 31 return queryContainerDescriptor.DateRange(c c.Field(timestamp).GreaterThanOrEquals(query.QueryStartTime)); 32 }); 33 34 } 35 if (query.QueryEndTime.Year 2020) 36 { 37 queryContainers.Add(queryContainerDescriptor 38 { 39 return queryContainerDescriptor.DateRange(c c.Field(timestamp).LessThanOrEquals(query.QueryEndTime)); 40 }); 41 } 42 //...省略其他字段 相关查询 43 44 boolQueryDescriptor.Must(x x.Bool(b b.Must(queryContainers))); 45 return boolQueryDescriptor; 46 }); 47 }) 48 .Sort(q q.Descending(sortField)) 49 .From(from).Size(size); 50 }); 51 return searchResponse1; 52 } 接口参数类: /// summary/// api接口日志查询参数/// /summarypublic class API_Query{/// summary/// 默认第一页/// /summarypublic int PageIndex { get; set; }/// summary/// 默认页大小为500/// /summarypublic int PageSize { get; set; }/// summary/// WARN 和 INFO/// /summarypublic string Level { get; set; }/// summary/// 对应timestamp 的开始时间,默认15分钟内/// /summarypublic string StartTime { get; set; }/// summary/// 对应timestamp 的结束时间,默认当前时间/// /summarypublic string EndTime { get; set; }public DateTime QueryStartTime { get; set; }public DateTime QueryEndTime { get; set; }} 调用方式: API_Query query new API_Query () { PageIndex1, PageSize10 };ISearchResponseDictionarystring, object searchResponse await GetSearchResponse(query);var hits searchResponse.HitsMetadata.Hits;var total searchResponse.Total;IReadOnlyCollectionDictionarystring, object res2 searchResponse.Documents;if (total 0){return res2.ToList()[0];} 0x03 时间字段预处理 PS: 如果 StartTime 和 EndTime 都不传值, 那么 默认设置 只查最近的 15分钟 封装一下 QueryStartTime 和 QueryEndTime public DateTime QueryStartTime{get{DateTime dt DateTime.Now.AddMinutes(-15);if (!string.IsNullOrEmpty(StartTime) StartTime.Trim() ! ){DateTime p;DateTime.TryParse(StartTime.Trim(), out p);if (p.Year 2020){dt p;}}return dt;}}public DateTime QueryEndTime{get{DateTime dt DateTime.Now;if (!string.IsNullOrEmpty(EndTime) EndTime.Trim() ! ){DateTime p;DateTime.TryParse(EndTime.Trim(), out p);if (p.Year 2020){dt p;}}return dt;}} 0x04 查找问题原因 以上 封装,经过测试, 能够获取到查询数据. 但是,但是 ,但是 坑爹的来了,当 外面传入参数 API_Query query new API_Query () { PageIndex1, PageSize10,StartTime 2023-04-28,EndTime 2023-04-28 15:00:00}; 查询的结果集里面居然有 2023-04-28 15:00:00 之后的数据. 使用的人反馈到我这里以后,我也觉得纳闷,啥情况呀. 需要监听一下 NEST 请求的实际语句 public class ESAPILogHelper{ElasticClient elasticClient;/// summary/// es通用查询类/// /summary/// param nameaddress/parampublic ESAPILogHelper(string address){elasticClient new ElasticClient(new ConnectionSettings(new Uri(address)).DisableDirectStreaming().OnRequestCompleted(apiCallDetails {if (apiCallDetails.Success){string infos GetInfosFromApiCallDetails(apiCallDetails);//在此处打断点,查看请求响应的原始内容Console.WriteLine(infos);}));}private string GetInfosFromApiCallDetails(IApiCallDetails r){string infos ;infos $Uri:\t{r.Uri}\n;infos $Success:\t{r.Success}\n;infos $SuccessOrKnownError:\t{r.SuccessOrKnownError}\n;infos $HttpMethod:\t{r.HttpMethod}\n;infos $HttpStatusCode:\t{r.HttpStatusCode}\n;//infos $DebugInformation:\n{r.DebugInformation}\n;//foreach (var deprecationWarning in r.DeprecationWarnings)// infos $DeprecationWarnings:\n{deprecationWarning}\n;if (r.OriginalException ! null){infos $OriginalException.GetMessage:\n{r.OriginalException.Message}\n;infos $OriginalException.GetStackTrace:\n{r.OriginalException.Message}\n;}if (r.RequestBodyInBytes ! null)infos $RequestBody:\n{Encoding.UTF8.GetString(r.RequestBodyInBytes)}\n;if (r.ResponseBodyInBytes ! null)infos $ResponseBody:\n{Encoding.UTF8.GetString(r.ResponseBodyInBytes)}\n;infos $ResponseMimeType:\n{r.ResponseMimeType}\n;return infos;} 请求分析: 如果 StartTime 和 EndTime 都不传值 , 请求的 参数为 { from: 0, query: { bool: { must: [ { bool: { must: [ { range: { timestamp: { gte: 2023-04-28T17:44:09.663021908:00 } } }, { range: { timestamp: { lte: 2023-04-28T17:59:09.665284408:00 } } } ] } } ] } }, size: 10, sort: [ { timestamp: { order: desc } } ] } 如果 StartTime 和 EndTime 传入 2023-04-28 和 2023-04-28 15:00:00, 请求的 参数为 {from: 0,query: {bool: {must: [{bool: {must: [{range: {timestamp: {gte: 2023-04-28T00:00:00}}},{range: {timestamp: {lte: 2023-04-28T15:00:00}}}]}}]}},size: 10,sort: [{timestamp: {order: desc}}] } 对比后发现 , 时间传值有2种不同的格式 timestamp: { gte: 2023-04-28T17:44:09.663021908:00 }timestamp: {gte: 2023-04-28T00:00:00 } 这两种格式 有什么 不一样呢?  0x05 测试求证 我做了个测试  //不传参数, 默认结束时间为当前时间 DateTime end_current DateTime.Now;//如果传了参数, 使用 DateTime.TryParse 取 结束时间 DateTime init query.QueryEndTime; DateTime endNew new DateTime(init.Year, init.Month, init.Day, init.Hour, init.Minute, init.Second);//这一步是 为了 补偿 时间值, 让 enNew 和 end_current 的ticks 一致long s1_input endNew.Ticks; long s2_current end_current.Ticks; endNew endNew.AddTicks(s2_current - s1_input);long t1 endNew.Ticks; long t2 end_current.Ticks;//对比 end_current 和 endNew, 现在的确是 相等的. bool isEqual t1 t2; // 结果为 true//但是, 传入 end_current 和 enNew,执行的请求 却不一样,queryContainerDescriptor.DateRange(c c.Field(timeStamp).LessThanOrEquals(end_current));请求结果为: 2023-04-28T17:44:09.663021908:00queryContainerDescriptor.DateRange(c c.Field(timeStamp).LessThanOrEquals(enNew)); 请求结果为: 2023-04-28T17:44:09.6630219Z 进一步测试  isEqual endNew end_current; //结果 true isEqual endNew.ToUniversalTime() end_current.ToUniversalTime(); //结果仍然为true isEqual endNew.ToLocalTime() end_current.ToLocalTime(); //结果居然为 fasle !!! 基于以上测试, 算是搞明白了是怎么回事. 比如现在是北京时间 : DateTime.Now 值为 2023-04-28 15:00:00, 那么 DateTime.Now.ToLocalTime() 还是 2023-04-28 15:00:00 Console.WriteLine(DateTime.Now.ToLocalTime()); 如是字符串 DateTime.Parse(2023-04-28 15:00:00).ToLocalTime(), 值为 2023-04-28 23:00:00 (比2023-04-28 15:00:00 多 8 个小时)那么回到题头部分, 当用户输入 2023-04-28 和 2023-04-28 15:00:00, 实际查询的数据范围为 2023-04-28 08:00:00 和 2023-04-28 23:00:00 自然就显示出了 2023-04-28 15点以后的数据,然后因为是倒序,又分了页 所以看不出日志的开始时间, 只能根据日志的结果时间 发现超了,来诊断. 0x06 解决方案 基于以上测试, 现在统一用 ToUniversalTime,即可保持数据的一致 isEqual endNew.ToUniversalTime().ToLocalTime() end_current.ToUniversalTime().ToLocalTime(); //结果为true Console.WriteLine(isEqual); //结果为 true 那么修改一下参数的取值 1 public DateTime QueryStartTime2 {3 get4 {5 DateTime dt DateTime.Now.AddMinutes(-15);6 if (!string.IsNullOrEmpty(StartTime) StartTime.Trim() ! )7 {8 DateTime p;9 DateTime.TryParse(StartTime.Trim(), out p); 10 if (p.Year 2020) 11 { 12 dt p; 13 } 14 } 15 return dt.ToUniversalTime(); 16 } 17 } 18 19 public DateTime QueryEndTime 20 { 21 get 22 { 23 24 DateTime dt DateTime.Now; 25 if (!string.IsNullOrEmpty(EndTime) EndTime.Trim() ! ) 26 { 27 DateTime p; 28 DateTime.TryParse(EndTime.Trim(), out p); 29 if (p.Year 2020) 30 { 31 dt p; 32 } 33 } 34 return dt.ToUniversalTime(); 35 } 36 } 好了, 现在问题解决了!!! 由此 推测 return queryContainerDescriptor.DateRange(c c.Field(timeStamp).GreaterThanOrEquals(DateMath from)); DateMath from 使用了 ToLocalTime . 0x07 简单测试用例 这里贴上简要的测试用例,方便重现问题. static void Main(string[] args){//首先 读取配置 Console.WriteLine(程序运行开始);try{//不传参数, 默认结束时间为当前时间DateTime end_current DateTime.Now;//如果传了参数, 使用 DateTime.TryParse 取 结束时间 DateTime init new DateTime() ;DateTime.TryParse(2023-04-28 15:00:00, out init);DateTime endNew new DateTime(init.Year, init.Month, init.Day, init.Hour, init.Minute, init.Second);//这一步是 为了 补偿 时间值, 让 enNew 和 end_current 的ticks 一致long s1_input endNew.Ticks;long s2_current end_current.Ticks;endNew endNew.AddTicks(s2_current - s1_input);//对比 end_current 和 enNew, 现在的确是 相等的.long t1 endNew.Ticks;long t2 end_current.Ticks;bool isEqual t1 t2; // 结果为 trueConsole.WriteLine(isEqual);isEqual endNew end_current;Console.WriteLine(isEqual);isEqual endNew.ToUniversalTime() end_current.ToUniversalTime();Console.WriteLine(isEqual);isEqual endNew.ToLocalTime() end_current.ToLocalTime();Console.WriteLine(isEqual);Console.WriteLine(endNew.ToLocalTime());Console.WriteLine(end_current.ToLocalTime());DateTime dinit;DateTime.TryParse(2023-04-28 15:00:00, out dinit);Console.WriteLine(dinit.ToLocalTime());isEqual endNew.ToUniversalTime().ToLocalTime() end_current.ToUniversalTime().ToLocalTime();Console.WriteLine(isEqual);}catch (Exception ex){string msg ex.Message;if (ex.InnerException ! null){msg ex.InnerException.Message;}Console.WriteLine(程序运行出现异常);Console.WriteLine(msg);}Console.WriteLine(程序运行结束);Console.ReadLine();}

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

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

相关文章

济南公众平台网站建设建行官网个人登录

Connetction Initiation是RDP连接的第一个阶段,具体包含两个消息RDP Negotiation Request和RDP Negotiation Response,下面结合协议数据包详细分析。 (1)RDP Negotiation Request 从数据包可以清晰看到此时的协议栈依次是TCP-TPKT…

重庆长寿网站建设网站开发专员

代码随想录算法训练营第三十八天 | 理论基础,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯 理论基础什么是动态规划动态规划的解题步骤动态规划应该如何debug 509. 斐波那契数递归解法 70. 爬楼梯746. 使用最小花费爬楼梯 理论基础 视…

网站开发技术发展企业网站设计步骤

今天是 2 月 14 日情人节,我看公众号后台有好多人在回复关键字:情人节表白代码。我想,我作为大家的校长,必须给大家送一波福利代码啊!我是真没想到,竟然很多程序员都想用代码表白,还整的挺浪漫的&#xff0…

网站建设超速云免费网页制作教程视频自学

目录 1. 修改源码,让模型能够生成出对于单个图像的标注。 2. 把数据转为yolo格式 3.把yolo格式转化为xml格式 这两天想偷懒,想让模型先在数据上标一遍,然后我再做修正,主要是图个省事。由于我们主要是利用paddle,模型也是基于p…

政务网站建设合同网站未备案可以上线吗

泛型 Generics泛型详解 使用泛型参数&#xff0c;有一个先决条件&#xff0c;必需在使用前对其进行声明&#xff1a; fn largest<T>(list: &[T]) -> T {该泛型函数的作用是从列表中找出最大的值&#xff0c;其中列表中的元素类型为 T。首先 largest<T> 对…

做网站怎么字体全部变粗了佛山营销型网站设计

本文介绍numpy数组中这四个方法的区别ndim、shape、dtype、astype。1.ndimndim返回的是数组的维度&#xff0c;返回的只有一个数&#xff0c;该数即表示数组的维度。2.shapeshape&#xff1a;表示各位维度大小的元组。返回的是一个元组。对于一维数组&#xff1a;有疑问的是为什…

医疗行业企业网站建设政企网站建设

【Arclist 标记】这个标记是DedeCms最常用的一个标记&#xff0c;也叫自由列表标记&#xff0c;其中 hotart、coolart、likeart、artlist、imglist、imginfolist、specart、autolist 这些标记都是由这个标记所定义的不同属性延伸出来的别名标记。功能说明&#xff1a;获取指定的…

南宁网站建设地方代运营有哪些套路坑

一模板&#xff1a; 模板不是数据类型&#xff0c;只能算是一种行为集合的表示。编译器在使用模板时&#xff0c;通过更换模板参数来创建数据类型。这个过程就是模板实例化(Instantiation)&#xff0c; 从模板类创建得到的类型称之为特例(specialization)&#xff0c;说白了就是…

做网站主页效果图有什么彩票网站做代理好点

在linux使用platform_driver_register() 注册 platform_driver 时&#xff0c; 需要在 platform_driver 的probe() 里面知道设备的中断号&#xff0c; 内存地址等资源。这些资源的描述信息存放在 resource 数据结构中&#xff0c; 相同的资源存放在一个树形树形数据结构中&…

sql数据库的网站迁移流程页面设计

在信息化、智能化浪潮席卷全球的今天&#xff0c;物联网SaaS平台作为推动工业数字化转型的重要工具&#xff0c;正日益受到广泛关注。那么&#xff0c;物联网SaaS平台究竟是什么&#xff1f;HiWoo Cloud作为物联网SaaS平台又有哪些独特优势&#xff1f;更重要的是&#xff0c;它…

网站推广手段有哪些cms的功能有哪些

在Java编程中&#xff0c;接口和抽象类是两个重要的概念。它们都用于实现面向对象编程中的抽象和封装&#xff0c;但在使用方式和功能上有所不同。本文将详细介绍Java中接口和抽象类的概念、用法和示例代码&#xff0c;帮助读者更好地理解和应用它们。 一、接口&#xff08;In…

建设电影网站选服务器怎么选鸿蒙os用什么语言开发app

linuxpython3.6.8uwsgipostgresqldjango部署web服务器 1.查看系统信息2.配置postgresql数据库2-1.安装postgresql数据库2-2.设置密码2-3.修改postgresql数据库配置文件 3.Python虚拟环境激活虚拟环境 4.Django4-1.Python 安装Django4-2.创建Django项目4-3.配置Django 5.uwsgi5-…

哪些经营范围可以开网站建设费用wordpress 设置显示中文字体

Jupyter Notebook是一个非常强大的工具&#xff0c;可以用于各种数据分析和机器学习任务&#xff0c;包括分类问题。在Jupyter Notebook中进行分类通常需要以下步骤&#xff1a; 导入所需的库&#xff1a;首先&#xff0c;你需要导入必要的Python库&#xff0c;例如NumPy、Pand…

微信分销网站建设比较好太原编程培训机构

本文并非基于微调训练模型&#xff0c;而是从头开始训练出一个全新的大语言模型的硬核教程。看完本篇&#xff0c;你将了解训练出一个大模型的环境准备、数据准备&#xff0c;生成分词&#xff0c;模型训练、测试模型等环节分别需要做什么。AI 小白友好~文中代码可以直接实操运…

漯河网站建设漯河wordpress pdf 打印

UNION ALL UNION ALL 用于合并两个或多个 SELECT 语句的结果。 请注意&#xff0c;UNION ALL 合并的每个 SELECT 语句必须是查询相同数量&#xff0c;相同数据类型的字段&#xff0c;且顺序也必须一致。另外结果集中的列名总是等于 UNION ALL 中第一个 SELECT 语句中的列名。 …

黄村专业网站建设公司网络推广员每天的工作是什么

RPA中国基于在科技行业的资源积累&#xff0c;以及对各领域「技术领导者」、「技术应用者」、「产品服务商」的深度调研&#xff0c;2023年&#xff0c;我们重点推出MI报告 ( Market Insight )、CI Vendor报告&#xff08;Comprehensive Influence Vendor&#xff09;两个系列。…

宁波五金网站建设小学生课程同步做网站软件

CopyOnWriteArraySet是CopyOnWriteArrayList类的弟弟。 这些是专用集合类&#xff0c;这些类是在JDK 1.5上添加的&#xff0c;以及它们最流行的表亲ConcurrentHashMap 。 它们是并发收集框架的一部分&#xff0c;位于java.util.concurrent包中。 CopyOnWriteArraySet最适合作为…

建设网站需要花费什么费用网站怎么样制作视频

流程控制 简单来讲所谓流程就是完成一件事情的多个步骤组合起来就叫做一个流程。在一个程序执行的过程中&#xff0c;各条语句的执行顺序对程序的结果是有直接影响的。我们必须清楚每条语句的执行流程。而且&#xff0c;很多时候要通过控制语句的执行顺序来实现我们想要的功能…

做网站怎么那么难宝安营销型网站建设公司

社交媒体的崛起已经改变了新闻媒体的传播方式。从Facebook到Twitter&#xff0c;从Instagram到LinkedIn&#xff0c;社交媒体平台为新闻媒体提供了一个巨大且潜力无限的受众群体。要在这个竞争激烈的环境中引爆社交媒体&#xff0c;需要一些技巧和诀窍。在本篇文章中&#xff0…

wordpress用户名忘记可以优化网络的软件

信息摘要 区别于对称加密和非对称加密&#xff0c;信息摘要算数是一种不可逆的操作&#xff0c;无论输入数据的大小输出的数据长度是固定的信息摘要算数对输入很敏感&#xff0c;即使数据变化很细微&#xff0c;输出的结果会出现很大的差异从不同输入得到相同的输出的概率非常…