一种基于ELK的日志存储方法与流程

文档序号:35419325发布日期:2023-09-12 23:48阅读:47来源:国知局
一种基于ELK的日志存储方法与流程

本发明涉及计算机,特别涉及一种基于elk的日志存储方法。


背景技术:

1、elk是三个开源软件的缩写,分别表示:elasticsearch、logstash和kibana,它们都是开源软件。elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能,它的特点有:分布式、零配置、自动发现、索引自动分片、索引副本机制、restful风格接口、多数据源和自动搜索负载等。logstash主要是用来日志的搜集、分析和过滤日志的工具,支持大量的数据获取方式,一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。kibana也是一个开源和免费的工具,kibana可以为logstash和elasticsearch提供的日志分析友好的web界面,可以帮助汇总、分析和搜索重要数据日志。行业内很多公司用elk作为日志系统。

2、目前行业内的大多数使用的方案,是将调用链路中的所有日志统一输出到elasticsearch的一个日志索引中(elasticsearch中的索引等同于数据库中表的概念),如图1所示。

3、当用户对某个web进行一次访问时,将会产生如图2的调用链:web->服务a->服务c->数据库,或者web->服务a->服务b->数据库。现有的这种方案一般会在调用的入口处产生一个requestid(请求标识),调用经过方法或服务(图2中的是经过服务)都会有日志探针将当前方法名、入参、出参、调用所用时间等连同requestid记录到elk系统中。

4、但是这种方式会有以下问题:

5、记录调用链将会产生大量的日志(尤其是在大系统中),这就导致可保存的日志量有限,需要定期清理。一般的系统中,只会保留三到六个月的日志。但有一些重要的日志企业是希望永久保存下去的。

6、这种记录方式,在调用链中出现异常时,这时异常日志和链路日志都会保存在同一索引下,因此不利于异常日志的搜索。从图1中可以看出,当有异常日志时不能从当前视图马上知道异常发在哪个位置。此外,因为链路日志是海量的,因此在链路日志里搜索异常日志会比较慢。另外,在java程序中,有时一些异常并不想抛出而是try catch(捕获异常),如图3,此处虽然有异常,但业务并不希望抛出,这时就会丢失了异常日志。


技术实现思路

1、为了克服现有技术存在的缺陷,本发明提供一种基于elk的日志存储方法,以解决上述的问题。

2、本发明解决其技术问题所采用的技术方案是:一种基于elk的日志存储方法,包括:

3、s1:建立调用链日志记录器、异常日志记录器和重要日志记录器;

4、s2:通过调用链日志记录器获取链路日志,通过异常日志记录器获取异常日志,通过重要日志记录器获取重要日志;

5、s3:使所述调用链日志记录器、异常日志记录器和重要日志记录器共享requestid、sessionid、用户id、用户名和入口方法名。

6、值得说明的是,在所述步骤s1中,于所述调用链日志记录器设置方法info(stringmethod,date stattime,object result,object args),其中参数string method为字符串方法,参数date stattime为方法开始时间,参数object result为对象结果,参数object args为返回结果;

7、通过方法info(stringmethod,date stattime,object result,object args),在链路日志上下文中获取requestid、sessionid、用户id和用户名,并将requestid、sessionid、用户id和用户名连同参数string method、参数date stattime、参数objectresult和参数object args一起记录到链路日志中;

8、在建立调用链日志记录器后,将调用链日志记录器设置在web入口日志层、web异常拦截层、dubbo调用拦截层、mybatis拦截层和dubbo服务前置拦截层,并设置成对程序员不可见状态。

9、可选的,在所述步骤s1中,于所述异常日志记录器设置方法error(throwable e)或者方法error(string message,throwable e),其中参数throwable e为可抛出的异常对象e,参数string message为异常说明;

10、通过方法error(throwable e)或者方法error(string message,throwable e),在异常日志上下文中获取requestid、sessionid、用户id、用户名和入口方法,并将requestid、sessionid、用户id、用户名和入口方法连同参数throwable e和/或参数stringmessage一起记录到异常日志中;

11、在建立异常日志记录器后,将异常日志记录器设置在web异常拦截层、dubbo调用拦截层、mybatis拦截层和dubbo服务前置拦截层,并设置成程序员可调用状态。

12、具体地,在所述步骤s1中,于所述重要日志记录器设置方法log(string funname,string message),其中参数string funname为功能名称,参数string message为功能信息;

13、通过方法log(stringfunname,string message),在重要日志上下文中获取requestid、sessionid、用户id、用户名和入口方法,并将requestid、sessionid、用户id、用户名和入口方法连同参数stringfunname和参数string message一起记录到重要日志中;

14、在建立重要日志记录器后,设置成程序员可调用状态。

15、优选的,在所述步骤s1中,当有请求进入web入口日志层时,先记录入口方法的方法、方法开始时间和参数,在请求返回时,返回结果记录,然后用调用链日志记录器输出链路日志。

16、可选的,在所述步骤s1中,当请求进入入口方法后,并且入口方法内部抛异常时,将被web异常拦截层拦截,然后从web入口日志层中获取方法、方法开始时间和参数,将异常的信息作为结果,用调用链日志记录器输出异常日志,然后再用异常日志记录器的error(throwable e)方法输出异常的详细信息,最后返回给用户指定的500页面。

17、值得说明的是,在所述步骤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)方法输出异常的详细信息作为异常日志,并将异常继续抛出。

18、具体地,在所述步骤s1中,利用dubbo服务前置拦截层的org.apache.dubbo.rpc.filter接口对应的接口方法result invoke(invoker<?>invoker,invocation invocation),先从发送包的附件中取出requestid、sessionid、用户id、用户名和入口方法,然后存入链路日志上下文和/或异常日志上下文中,从参数invoker和参数invocation中取出业务方法和业务方法对应要传输的参数,并记录开始时间,然后调用参数invoker的invoke方法调用业务实现;当有返回结果时,利用调用链日志记录器输出链路日志;当业务调用抛异常时,先用调用链日志记录器输出链路日志,再调用异常日志记录器的error(throwable e)方法输出异常的详细信息作为异常日志,并将异常继续抛出,最后清空链路日志上下文和/或异常日志上下文。

19、优选的,在所述步骤s1中,利用mybatis拦截层的org.apache.ibatis.plugin.interceptor接口对应的接口方法object intercept(invocation invocation),从参数invocation中获取到要执行的数据库的查询语句作为方法,还从参数invocation中取出参数,并记录开始时间,然后调用参数invocation的proceed方法调用数据库;当有返回结果时,用调用链日志记录器输出链路日志;当数据库的查询语句执行抛异常时,先用调用链日志记录器输出链路日志,再调用异常日志记录器的error(throwable e)方法输出异常的详细信息作为异常日志,并将异常继续抛出。

20、可选的,还包括步骤s4,所述步骤s4包括:当需要用http调用内部的web接口时,在http发起调用前,先从链路日志上下文、异常日志上下文和/或重要日志上下文中获取requestid,将requestid的值填入请求头为_requestid_中。

21、本发明的有益效果在于:在所述基于elk的日志存储方法中,将调用链路日志、异常日志和重要日志拆分,方便了异常时间的查询,同时将重要的日志保存更久。将调用链路日志、异常日志和重要日志分别保存在三个不同的日志记录器中,就能提高日志存储的量。将链路日志、异常日志和重要日志记录到不同的索引下并共享requestid,如此,就可以用一个索引下的requestid去另一个索引下查相关信息,提供的异常日志器将try catch中的异常也记录下来,并且链路日志、异常日志和重要日志除共享requestid(请求标识)外,还会共享sessionid(会话标识)、用户id、用户名和入口方法名(入口方法名在重要日志中特别重要,因为很可能某个日志已经过了很久,这时想通过requetid去调用链路日志查入口,已经查询不到了),如此,在调用链中出现异常时,也能通过一个索引下的requestid搜索到异常的日志。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1