一种基于ELK的日志存储方法与流程
未命名
09-13
阅读:201
评论:0
一种基于elk的日志存储方法
技术领域
1.本发明涉及计算机技术领域,特别涉及一种基于elk的日志存储方法。
背景技术:
2.elk是三个开源软件的缩写,分别表示:elasticsearch、logstash和kibana,它们都是开源软件。elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能,它的特点有:分布式、零配置、自动发现、索引自动分片、索引副本机制、restful风格接口、多数据源和自动搜索负载等。logstash主要是用来日志的搜集、分析和过滤日志的工具,支持大量的数据获取方式,一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。kibana也是一个开源和免费的工具,kibana可以为logstash和elasticsearch提供的日志分析友好的web界面,可以帮助汇总、分析和搜索重要数据日志。行业内很多公司用elk作为日志系统。
3.目前行业内的大多数使用的方案,是将调用链路中的所有日志统一输出到elasticsearch的一个日志索引中(elasticsearch中的索引等同于数据库中表的概念),如图1所示。
4.当用户对某个web进行一次访问时,将会产生如图2的调用链:web-》服务a-》服务c-》数据库,或者web-》服务a-》服务b-》数据库。现有的这种方案一般会在调用的入口处产生一个requestid(请求标识),调用经过方法或服务(图2中的是经过服务)都会有日志探针将当前方法名、入参、出参、调用所用时间等连同requestid记录到elk系统中。
5.但是这种方式会有以下问题:
6.记录调用链将会产生大量的日志(尤其是在大系统中),这就导致可保存的日志量有限,需要定期清理。一般的系统中,只会保留三到六个月的日志。但有一些重要的日志企业是希望永久保存下去的。
7.这种记录方式,在调用链中出现异常时,这时异常日志和链路日志都会保存在同一索引下,因此不利于异常日志的搜索。从图1中可以看出,当有异常日志时不能从当前视图马上知道异常发在哪个位置。此外,因为链路日志是海量的,因此在链路日志里搜索异常日志会比较慢。另外,在java程序中,有时一些异常并不想抛出而是try catch(捕获异常),如图3,此处虽然有异常,但业务并不希望抛出,这时就会丢失了异常日志。
技术实现要素:
8.为了克服现有技术存在的缺陷,本发明提供一种基于elk的日志存储方法,以解决上述的问题。
9.本发明解决其技术问题所采用的技术方案是:一种基于elk的日志存储方法,包括:
10.s1:建立调用链日志记录器、异常日志记录器和重要日志记录器;
11.s2:通过调用链日志记录器获取链路日志,通过异常日志记录器获取异常日志,通过重要日志记录器获取重要日志;
12.s3:使所述调用链日志记录器、异常日志记录器和重要日志记录器共享requestid、sessionid、用户id、用户名和入口方法名。
13.值得说明的是,在所述步骤s1中,于所述调用链日志记录器设置方法info(stringmethod,date stattime,object result,object args),其中参数string method为字符串方法,参数date stattime为方法开始时间,参数object result为对象结果,参数object args为返回结果;
14.通过方法info(stringmethod,date stattime,object result,object args),在链路日志上下文中获取requestid、sessionid、用户id和用户名,并将requestid、sessionid、用户id和用户名连同参数string method、参数date stattime、参数object result和参数object args一起记录到链路日志中;
15.在建立调用链日志记录器后,将调用链日志记录器设置在web入口日志层、web异常拦截层、dubbo调用拦截层、mybatis拦截层和dubbo服务前置拦截层,并设置成对程序员不可见状态。
16.可选的,在所述步骤s1中,于所述异常日志记录器设置方法error(throwable e)或者方法error(string message,throwable e),其中参数throwable e为可抛出的异常对象e,参数string message为异常说明;
17.通过方法error(throwable e)或者方法error(string message,throwable e),在异常日志上下文中获取requestid、sessionid、用户id、用户名和入口方法,并将requestid、sessionid、用户id、用户名和入口方法连同参数throwable e和/或参数string message一起记录到异常日志中;
18.在建立异常日志记录器后,将异常日志记录器设置在web异常拦截层、dubbo调用拦截层、mybatis拦截层和dubbo服务前置拦截层,并设置成程序员可调用状态。
19.具体地,在所述步骤s1中,于所述重要日志记录器设置方法log(string funname,string message),其中参数string funname为功能名称,参数string message为功能信息;
20.通过方法log(stringfunname,string message),在重要日志上下文中获取requestid、sessionid、用户id、用户名和入口方法,并将requestid、sessionid、用户id、用户名和入口方法连同参数stringfunname和参数string message一起记录到重要日志中;
21.在建立重要日志记录器后,设置成程序员可调用状态。
22.优选的,在所述步骤s1中,当有请求进入web入口日志层时,先记录入口方法的方法、方法开始时间和参数,在请求返回时,返回结果记录,然后用调用链日志记录器输出链路日志。
23.可选的,在所述步骤s1中,当请求进入入口方法后,并且入口方法内部抛异常时,将被web异常拦截层拦截,然后从web入口日志层中获取方法、方法开始时间和参数,将异常的信息作为结果,用调用链日志记录器输出异常日志,然后再用异常日志记录器的error(throwable e)方法输出异常的详细信息,最后返回给用户指定的500页面。
24.值得说明的是,在所述步骤s1中,从dubbo调用拦截层的
org.apache.dubbo.rpc.filter接口对应的接口方法result invoke(invoker《?》invoker,invocation invocation)中的参数invoker和参数invocation获取业务方法和业务方法对应要传输的参数,并记录开始时间,然后从链路日志上下文中获取requestid、sessionid、用户id和用户名,或者从异常日志上下文中获取requestid、sessionid、用户id、用户名和入口方法,并调用dubbo调用拦截层对应的dubbo框架提供的rpccontext.getcontext().setattachment(stringkey,string value)方法将requestid、sessionid、用户id、用户名和入口方法记录到发送包的附件中,然后调用参数invoker的invoke方法去调用远程dubbo服务;当有返回结果时,用调用链日志记录器输出链路日志;当远程调用抛异常时,先用调用链日志记录器输出链路日志,再调用异常日志记录器的error(throwable e)方法输出异常的详细信息作为异常日志,并将异常继续抛出。
25.具体地,在所述步骤s1中,利用dubbo服务前置拦截层的org.apache.dubbo.rpc.filter接口对应的接口方法result invoke(invoker《?》invoker,invocation invocation),先从发送包的附件中取出requestid、sessionid、用户id、用户名和入口方法,然后存入链路日志上下文和/或异常日志上下文中,从参数invoker和参数invocation中取出业务方法和业务方法对应要传输的参数,并记录开始时间,然后调用参数invoker的invoke方法调用业务实现;当有返回结果时,利用调用链日志记录器输出链路日志;当业务调用抛异常时,先用调用链日志记录器输出链路日志,再调用异常日志记录器的error(throwable e)方法输出异常的详细信息作为异常日志,并将异常继续抛出,最后清空链路日志上下文和/或异常日志上下文。
26.优选的,在所述步骤s1中,利用mybatis拦截层的org.apache.ibatis.plugin.interceptor接口对应的接口方法object intercept(invocation invocation),从参数invocation中获取到要执行的数据库的查询语句作为方法,还从参数invocation中取出参数,并记录开始时间,然后调用参数invocation的proceed方法调用数据库;当有返回结果时,用调用链日志记录器输出链路日志;当数据库的查询语句执行抛异常时,先用调用链日志记录器输出链路日志,再调用异常日志记录器的error(throwable e)方法输出异常的详细信息作为异常日志,并将异常继续抛出。
27.可选的,还包括步骤s4,所述步骤s4包括:当需要用http调用内部的web接口时,在http发起调用前,先从链路日志上下文、异常日志上下文和/或重要日志上下文中获取requestid,将requestid的值填入请求头为_requestid_中。
28.本发明的有益效果在于:在所述基于elk的日志存储方法中,将调用链路日志、异常日志和重要日志拆分,方便了异常时间的查询,同时将重要的日志保存更久。将调用链路日志、异常日志和重要日志分别保存在三个不同的日志记录器中,就能提高日志存储的量。将链路日志、异常日志和重要日志记录到不同的索引下并共享requestid,如此,就可以用一个索引下的requestid去另一个索引下查相关信息,提供的异常日志器将try catch中的异常也记录下来,并且链路日志、异常日志和重要日志除共享requestid(请求标识)外,还会共享sessionid(会话标识)、用户id、用户名和入口方法名(入口方法名在重要日志中特别重要,因为很可能某个日志已经过了很久,这时想通过requetid去调用链路日志查入口,已经查询不到了),如此,在调用链中出现异常时,也能通过一个索引下的requestid搜索到异常的日志。
附图说明
29.图1为现有技术中elasticsearch的索引;
30.图2为现有技术中用户访问某个web时的流程示意图;
31.图3为现有技术中心一段有异常但不希望抛出的java程序;
32.图4为本发明的一个实施例中基于elk的日志存储方法的流程图;
33.图5为本发明的一个实施例中三种日志记录器和六种拦截层的配置图;
34.图6为本发明的一个实施例中用户指定的500页面。
具体实施方式
35.下面结合附图对本发明的具体实施方式作进一步说明。在此需要说明的是,对于这些实施方式的说明用于帮助理解本发明,但并不构成对本发明的限定。此外,下面所描述的本发明各个实施方式中所涉及的技术特征只要彼此之间未构成冲突就可以相互组合。
36.本发明适用于springmvc+dubbo的微服务框架下,提供springmvc和dubbo的拦截层。
37.如图1-6所示,一种基于elk的日志存储方法,包括:
38.s1:建立调用链日志记录器、异常日志记录器和重要日志记录器;
39.s2:通过调用链日志记录器获取链路日志,通过异常日志记录器获取异常日志,通过重要日志记录器获取重要日志;通过异常日志记录器将try catch中的异常也记录下来
40.s3:使所述调用链日志记录器、异常日志记录器和重要日志记录器共享requestid、sessionid、用户id、用户名和入口方法名。
41.在所述基于elk的日志存储方法中,将调用链路日志、异常日志和重要日志拆分,方便了异常时间的查询,同时将重要的日志保存更久。将调用链路日志、异常日志和重要日志分别保存在三个不同的日志记录器中,就能提高日志存储的量。将链路日志、异常日志和重要日志记录到不同的索引下并共享requestid,如此,就可以用一个索引下的requestid去另一个索引下查相关信息,提供的异常日志器将try catch中的异常也记录下来,并且链路日志、异常日志和重要日志除共享requestid(请求标识)外,还会共享sessionid(会话标识)、用户id、用户名和入口方法名(入口方法名在重要日志中特别重要,因为很可能某个日志已经过了很久,这时想通过requetid去调用链路日志查入口,已经查询不到了),如此,在调用链中出现异常时,也能通过一个索引下的requestid搜索到异常的日志。
42.值得说明的是,在所述步骤s1中,于所述调用链日志记录器设置方法info(stringmethod,date stattime,object result,object args),其中参数string method为字符串方法,参数date stattime为方法开始时间,参数object result为对象结果,参数object args为返回结果;
43.通过方法info(stringmethod,date stattime,object result,object args),在链路日志上下文中获取requestid、sessionid、用户id和用户名,并将requestid、sessionid、用户id和用户名连同参数string method、参数date stattime、参数object result和参数object args一起记录到链路日志中;
44.在建立调用链日志记录器后,将调用链日志记录器设置在web入口日志层、web异常拦截层、dubbo调用拦截层、mybatis拦截层和dubbo服务前置拦截层,并设置成对程序员
不可见状态。经调用链日志记录器所记录的链路日志,将会输出到elk的userlog-*的索引下。
45.可选的,在所述步骤s1中,于所述异常日志记录器设置方法error(throwable e)或者方法error(stringmessage,throwable e),其中参数throwable e为可抛出的异常对象e,用于将异常对象e设置成可抛出,参数string message为异常说明,用于对异常对象设置异常说明;
46.通过方法error(throwable e)或者方法error(string message,throwable e),在异常日志上下文中获取requestid、sessionid、用户id、用户名和入口方法,并将requestid、sessionid、用户id、用户名和入口方法连同参数throwable e和/或参数string message一起记录到异常日志中;
47.在建立异常日志记录器后,将异常日志记录器设置在web异常拦截层、dubbo调用拦截层、mybatis拦截层和dubbo服务前置拦截层,并设置成程序员可调用状态。经调异常日志记录器所记录的异常日志,将会输出到elk的exceptionlog-*的索引下。
48.优选的,在所述步骤s1中,于所述重要日志记录器设置方法log(string funname,string message),其中参数string funname为功能名称,参数string message为功能信息;
49.通过方法log(stringfunname,string message),在重要日志上下文中获取requestid、sessionid、用户id、用户名和入口方法,并将requestid、sessionid、用户id、用户名和入口方法连同参数string funname和参数string message一起记录到重要日志中;
50.在建立重要日志记录器后,设置成程序员可调用状态。经重要日志记录器记录的重要日志,将会输出到elk的normaloperationlog-*的索引下。
51.具体地,在所述步骤s1中,当有请求进入web入口日志层时,先记录入口方法的方法、方法开始时间和参数,在请求返回时,返回结果记录,然后用调用链日志记录器输出链路日志。
52.值得说明的是,在所述步骤s1中,当请求进入入口方法后,并且入口方法内部抛异常时,将被web异常拦截层拦截,然后从web入口日志层中获取方法、方法开始时间和参数,将异常的信息作为结果,用调用链日志记录器输出异常日志,然后再用异常日志记录器的error(throwable e)方法输出异常的详细信息,最后返回给用户指定的500页面。在500页面上可先择一处,展示requestid的值,如图6所示。在web工程中设有web异常拦截层,用户可在此层设置错误页面,当有异常抛出时,将requestid暴露出来,方便快速定位异常源。
53.优选的,在所述步骤s1中,从dubbo调用拦截层的org.apache.dubbo.rpc.filter接口对应的接口方法result invoke(invoker《?》invoker,invocation invocation)中的参数invoker和参数invocation获取业务方法和业务方法对应要传输的参数,并记录开始时间,然后从链路日志上下文中获取requestid、sessionid、用户id和用户名,或者从异常日志上下文中获取requestid、sessionid、用户id、用户名和入口方法,并调用dubbo调用拦截层对应的dubbo框架提供的rpccontext.getcontext().setattachment(string key,string value)方法将requestid、sessionid、用户id、用户名和入口方法记录到发送包的附件中,然后调用参数invoker的invoke方法去调用远程dubbo服务;当有返回结果时,用调用链日志记录器输出链路日志;当远程调用抛异常时,先用调用链日志记录器输出链路日
志,此时链路日志为异常的简单信息作为结果,再调用异常日志记录器的error(throwable e)方法输出异常的详细信息作为异常日志,并将异常继续抛出。
54.可选的,在所述步骤s1中,利用dubbo服务前置拦截层的org.apache.dubbo.rpc.filter接口对应的接口方法result invoke(invoker《?》invoker,invocation invocation),先从发送包的附件中取出requestid、sessionid、用户id、用户名和入口方法,然后存入链路日志上下文和/或异常日志上下文中,从参数invoker和参数invocation中取出业务方法和业务方法对应要传输的参数,并记录开始时间,然后调用参数invoker的invoke方法调用业务实现;当有返回结果时,利用调用链日志记录器输出链路日志;当业务调用抛异常时,先用调用链日志记录器输出链路日志,此时链路日志为异常的简单信息作为结果,再调用异常日志记录器的error(throwable e)方法输出异常的详细信息作为异常日志,并将异常继续抛出,最后清空链路日志上下文和/或异常日志上下文。
55.值得说明的是,在所述步骤s1中,利用mybatis拦截层的org.apache.ibatis.plugin.interceptor接口对应的接口方法object intercept(invocation invocation),从参数invocation中获取到要执行的数据库的查询语句作为方法,还从参数invocation中取出参数,并记录开始时间,然后调用参数invocation的proceed方法调用数据库;当有返回结果时,用调用链日志记录器输出链路日志;当数据库的查询语句执行抛异常时,先用调用链日志记录器输出链路日志,此时链路日志为异常的简单信息作为结果,再调用异常日志记录器的error(throwable e)方法输出异常的详细信息作为异常日志,并将异常继续抛出。
56.所述基于elk的日志存储方法还会利用基础信息获取层,先尝试从httpservletrequest对象的请求头中,获取请求头“_requestid”的值,如果获取得到则作为requestid,如果获取不到则再尝试从请求的url参数中获取“_requestid”的值,如果获取得到则作为requestid,如果还是获取不到则为当前请求生成requestid,然后从httpservletrequest对象中获取sessionid、sesssion信息、用户id和用户名,然后将requestid、sessionid、用户id和用户名存入链路日志上下文、异常日志上下文或重要日志上下文中。而sesssion信息则给web入口日志层直接使用,当请求处理返回到基础信息获取层时,将清空日志上下文。
57.如图5所示,为六种拦截层,这六种拦截层只需配置即可,不需要程序员写代码。它们的位置都如图5所示。其中,mybatis拦截层和dubbo调用拦截层为可选配置,只有当该工程需要时才配置。
58.值得说明的是,对于内部的http调用,调用链会断开,即requestid在http被请求时会丢失,因此在本实施例中,所述基于elk的日志存储方法还包括步骤s4,所述步骤s4包括:当需要用http调用内部的web接口时,在http发起调用前,先从链路日志上下文、异常日志上下文和/或重要日志上下文中获取requestid,将requestid的值填入请求头为_requestid_中。这样在web接收到请求时,会在基础信息获取层获取到这个requestid,内部的http调用时,调用链不断开。
59.链路日志上下文、异常日志上下文和/或重要日志上下文的内部维护了一个jdk提供的threadlocal对象,该对象可以将变量保存在当前执行的线程当中。链路日志上下文、异常日志上下文和/或重要日志上下文中所存变量为一个map对象,以供存取日志所需的公共信息。
60.因为将三种日志(链路日志、异常日志和重要日志)分开三个索引存储,在elasticsearch中,可按索引设置存储的策略。这样就可将索引userlog-*的过期时间设短,而将索引normaloperationlog-*的时间设长,从而兼顾存储和重要日志保存时间长的需要。
61.以上结合附图对本发明的实施方式作了详细说明,但本发明不限于所描述的实施方式。对于本领域的技术人员而言,在不脱离本发明原理和精神的情况下,对这些实施方式进行多种变化、修改、替换和变型,仍落入本发明的保护范围内。
技术特征:
1.一种基于elk的日志存储方法,其特征在于,包括:s1:建立调用链日志记录器、异常日志记录器和重要日志记录器;s2:通过调用链日志记录器获取链路日志,通过异常日志记录器获取异常日志,通过重要日志记录器获取重要日志;s3:使所述调用链日志记录器、异常日志记录器和重要日志记录器共享requestid、sessionid、用户id、用户名和入口方法名。2.根据权利要求1所述的一种基于elk的日志存储方法,其特征在于:在所述步骤s1中,于所述调用链日志记录器设置方法info(string method,date stattime,object result,object args),其中参数string method为字符串方法,参数date stattime为方法开始时间,参数object result为对象结果,参数object args为返回结果;通过方法info(string method,date stattime,object result,object args),在链路日志上下文中获取requestid、sessionid、用户id和用户名,并将requestid、sessionid、用户id和用户名连同参数string method、参数date stattime、参数object result和参数object args一起记录到链路日志中;在建立调用链日志记录器后,将调用链日志记录器设置在web入口日志层、web异常拦截层、dubbo调用拦截层、mybatis拦截层和dubbo服务前置拦截层,并设置成对程序员不可见状态。3.根据权利要求2所述的一种基于elk的日志存储方法,其特征在于:在所述步骤s1中,于所述异常日志记录器设置方法error(throwable e)或者方法error(stringmessage,throwable e),其中参数throwable e为可抛出的异常对象e,参数string message为异常说明;通过方法error(throwable e)或者方法error(string message,throwable e),在异常日志上下文中获取requestid、sessionid、用户id、用户名和入口方法,并将requestid、sessionid、用户id、用户名和入口方法连同参数throwable e和/或参数string message一起记录到异常日志中;在建立异常日志记录器后,将异常日志记录器设置在web异常拦截层、dubbo调用拦截层、mybatis拦截层和dubbo服务前置拦截层,并设置成程序员可调用状态。4.根据权利要求3所述的一种基于elk的日志存储方法,其特征在于:在所述步骤s1中,于所述重要日志记录器设置方法log(string funname,string message),其中参数string funname为功能名称,参数string message为功能信息;通过方法log(string funname,string message),在重要日志上下文中获取requestid、sessionid、用户id、用户名和入口方法,并将requestid、sessionid、用户id、用户名和入口方法连同参数string funname和参数string message一起记录到重要日志中;在建立重要日志记录器后,设置成程序员可调用状态。5.根据权利要求4所述的一种基于elk的日志存储方法,其特征在于:在所述步骤s1中,当有请求进入web入口日志层时,先记录入口方法的方法、方法开始时间和参数,在请求返回时,返回结果记录,然后用调用链日志记录器输出链路日志。6.根据权利要求5所述的一种基于elk的日志存储方法,其特征在于:在所述步骤s1中,当请求进入入口方法后,并且入口方法内部抛异常时,将被web异常拦截层拦截,然后从web
入口日志层中获取方法、方法开始时间和参数,将异常的信息作为结果,用调用链日志记录器输出异常日志,然后再用异常日志记录器的error(throwable e)方法输出异常的详细信息,最后返回给用户指定的500页面。7.根据权利要求6所述的一种基于elk的日志存储方法,其特征在于:在所述步骤s1中,从dubbo调用拦截层的org.apache.dubbo.rpc.filter接口对应的接口方法result invoke(invoker<?>invoker,invocation invocation)中的参数invoker和参数invocation获取业务方法和业务方法对应要传输的参数,并记录开始时间,然后从链路日志上下文中获取requestid、sessionid、用户id和用户名,或者从异常日志上下文中获取requestid、sessionid、用户id、用户名和入口方法,并调用dubbo调用拦截层对应的dubbo框架提供的rpccontext.getcontext().setattachment(string key,string value)方法将requestid、sessionid、用户id、用户名和入口方法记录到发送包的附件中,然后调用参数invoker的invoke方法去调用远程dubbo服务;当有返回结果时,用调用链日志记录器输出链路日志;当远程调用抛异常时,先用调用链日志记录器输出链路日志,再调用异常日志记录器的error(throwable e)方法输出异常的详细信息作为异常日志,并将异常继续抛出。8.根据权利要求7所述的一种基于elk的日志存储方法,其特征在于:在所述步骤s1中,利用dubbo服务前置拦截层的org.apache.dubbo.rpc.filter接口对应的接口方法result invoke(invoker<?>invoker,invocation invocation),先从发送包的附件中取出requestid、sessionid、用户id、用户名和入口方法,然后存入链路日志上下文和/或异常日志上下文中,从参数invoker和参数invocation中取出业务方法和业务方法对应要传输的参数,并记录开始时间,然后调用参数invoker的invoke方法调用业务实现;当有返回结果时,利用调用链日志记录器输出链路日志;当业务调用抛异常时,先用调用链日志记录器输出链路日志,再调用异常日志记录器的error(throwable e)方法输出异常的详细信息作为异常日志,并将异常继续抛出,最后清空链路日志上下文和/或异常日志上下文。9.根据权利要求8所述的一种基于elk的日志存储方法,其特征在于:在所述步骤s1中,利用mybatis拦截层的org.apache.ibatis.plugin.interceptor接口对应的接口方法object intercept(invocation invocation),从参数invocation中获取到要执行的数据库的查询语句作为方法,还从参数invocation中取出参数,并记录开始时间,然后调用参数invocation的proceed方法调用数据库;当有返回结果时,用调用链日志记录器输出链路日志;当数据库的查询语句执行抛异常时,先用调用链日志记录器输出链路日志,再调用异常日志记录器的error(throwable e)方法输出异常的详细信息作为异常日志,并将异常继续抛出。10.根据权利要求9所述的一种基于elk的日志存储方法,其特征在于:还包括步骤s4,所述步骤s4包括:当需要用http调用内部的web接口时,在http发起调用前,先从链路日志上下文、异常日志上下文和/或重要日志上下文中获取requestid,将requestid的值填入请求头为_requestid_中。
技术总结
本发明公开了一种基于ELK的日志存储方法,属于计算机技术领域,包括:S1:建立调用链日志记录器、异常日志记录器和重要日志记录器;S2:通过调用链日志记录器获取链路日志,通过异常日志记录器获取异常日志,通过重要日志记录器获取重要日志;S3:使所述调用链日志记录器、异常日志记录器和重要日志记录器共享requestId、sessionId、用户ID、用户名和入口方法名。所述基于ELK的日志存储方法解决了现有的日志存储方式保存的日志量有限,并且异常日志会抛出从而丢失了异常日志的问题。志会抛出从而丢失了异常日志的问题。志会抛出从而丢失了异常日志的问题。
技术研发人员:李宝君 何玉华
受保护的技术使用者:全通金信控股(广东)有限公司
技术研发日:2023.04.14
技术公布日:2023/9/11
版权声明
本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
飞行汽车 https://www.autovtol.com/
