一种日志级别动态调整方法及装置与流程

文档序号:16327487发布日期:2018-12-19 06:00阅读:354来源:国知局
一种日志级别动态调整方法及装置与流程

本发明涉及软件开发领域,尤其涉及一种日志级别动态调整方法及装置。

背景技术

作为软件开发人员,当线上项目出现问题时,我们必须能够快速高效的找到问题的根源并解决。如何提高排查问题的效率呢?最有效的方式是通过分析系统日志。如果系统日志全面,会为我们排查解决线上问题带来绝大的帮助,但是要想保证系统日志全面,就必须打印出所有的系统或业务日志。这样就会带来另一个问题,那就是日志量的暴涨,大量的日志虽然能够帮助我们解决问题外,但是会直接造成系统性能下降,极端情况下,甚至会导致系统宕机。



技术实现要素:

本发明实施例通过提供一种日志级别动态调整方法及装置,解决了日志过多而造成系统性能下降的技术问题。

第一方面,本发明实施例提供了一种日志级别动态调整方法,应用于添加有日志级别动态调整组件的宿主应用,基于启动后的所述日志级别动态调整组件执行的步骤包括:

识别出所述宿主应用当前绑定的日志框架,并加载与所述日志框架相匹配的日志管理接口的实现类以及所述日志框架相匹配的日志修改接口的实现类;

调用所述日志管理接口的实现类中的日志管理方法,以加载所述日志框架管理的所有日志对象至目标容器中,并从所述目标容器中取出所述日志框架管理的所有日志对象;

调用所述日志修改接口的实现类中的日志修改方法,以对从所述目标容器中取出的所述日志框架管理的所有日志对象中需要修改日志级别的日志对象,进行修改日志级别。

可选的,在所述识别出所述宿主应用当前绑定的日志框架之前,所述方法还包括:

检测到所述宿主应用启动时,将所述日志级别动态调整组件跟随所述宿主应用启动;

基于启动后的日志级别动态调整组件实例化日志上下文接口和启动日志服务器,其中,所述日志服务器对外提供用于查询和修改日志级别的接口。

可选的,检测到所述宿主应用启动时,基于在所述日志级别动态调整组件中添加的清单文件启动所述日志级别动态调整组件。

可选的,所述识别出所述宿主应用当前绑定的日志框架,并加载与所述日志框架相匹配的日志管理接口的实现类以及所述日志框架相匹配的日志修改接口的实现类,包括:

加载所述日志上下文接口的实现类;

识别所述宿主应用当前绑定的日志框架;

调用所述日志上下文接口的实现类中的方法,以根据所述宿主应用当前绑定的日志框架实例化所述日志管理接口的实现类,以及实例化所述日志修改接口的实现类。

可选的,所述日志管理接口中,至少定义有如下函数:

用于加载所述宿主应用使用的所有的日志对象到目标容器中的函数,和

用于返回所述宿主应用当前绑定的日志框架的类型的函数,和

用于批量修改日志对象的日志级别的函数。

可选的,所述日志修改接口中,至少定义有如下函数:

将所述宿主应用当前绑定的日志框架的日志对象的日志级别转换成统一日志级别的函数,和

将所述宿主应用当前绑定的日志框架的日志对象的日志级别分别修改成指定日志级别的函数。

第二方面,本发明实施例提供了一种日志级别动态调整组件,添加在宿主应用中,所述日志级别动态调整组件包括:

日志框架识别单元,用于识别出所述宿主应用当前绑定的日志框架,并加载与所述日志框架相匹配的日志管理接口的实现类以及所述日志框架相匹配的日志修改接口的实现类;

日志对象获取单元,用于调用所述日志管理接口的实现类中的日志管理方法,以加载所述日志框架管理的所有日志对象至目标容器中,并从所述目标容器中取出所述日志框架管理的所有日志对象;

日志级别修改单元,调用所述日志修改接口的实现类中的日志修改方法,以对从所述目标容器中取出的所述日志框架管理的所有日志对象中需要修改日志级别的日志对象,进行修改日志级别。

可选的,所述组件还包括:

启动单元,用于在所述识别出所述宿主应用当前绑定的日志框架之前,检测到所述宿主应用启动时,将所述日志级别动态调整组件跟随所述宿主应用启动;

基于启动后的日志级别动态调整组件实例化日志上下文接口和启动日志服务器,其中,所述日志服务器对外提供用于查询和修改日志级别的接口。

可选的,所述启动单元,用于:检测到所述宿主应用启动时,基于在所述日志级别动态调整组件中添加的清单文件启动所述日志级别动态调整组件。

可选的,所述日志框架识别单元,具体用于:

加载所述日志上下文接口的实现类;

识别出所述宿主应用当前绑定的日志框架;

调用所述日志上下文接口的实现类中的方法,根据所述宿主应用当前绑定的日志框架实例化与所述日志管理接口对应的实现类,以及实例化与所述日志修改接口对应的实现类。

可选的,所述日志管理接口中至少定义有如下函数:

用于加载所述宿主应用使用的所有的日志对象到目标容器中的函数,和

用于返回所述宿主应用当前绑定的日志框架的类型的函数,和

用于批量修改日志对象的日志级别的函数。

可选的,所述日志修改接口中至少定义有如下函数:

将所述宿主应用当前绑定的日志框架的日志对象的日志级别转换成统一日志级别的函数,和

将所述宿主应用当前绑定的日志框架的日志对象的日志级别分别修改成指定日志级别的函数。

第三方面,本发明实施例提供了一种计算机可读存储介质,其上存储有计算机程序,程序包括添加有日志级别动态调整组件的宿主应用,该程序被处理器执行时实现第一方面中的任一实现方式所述的步骤。

第四方面,本发明实施例提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,该程序包括添加有日志级别动态调整组件的宿主应用,所述处理器执行所述程序时实现第一方面中的任一实现方式所述的步骤。

本发明实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:

通过开发了日志级别动态调整组件,识别出宿主应用当前绑定的日志框架,并加载与日志框架相匹配的日志管理接口的实现类、日志修改接口的实现类;调用日志管理接口的实现类中的日志管理方法,以加载日志框架所管理的所有日志对象至目标容器中,从目标容器中取出日志框架所管理的所有日志对象;调用日志修改接口的实现类中的日志修改方法,以对从目标容器中取出的日志框架管理的所有日志对象中需要修改日志级别的日志对象,进行修改日志级别,从而通过该日志级别动态调整组件可以在需要解决宿主应用的线上问题时实时调整线上日志的输出级别,以能够获取该宿主应用全面的调试日志,提高了定位宿主应用的线上问题的效率,同时又不会使日志量暴增,因此不会降低系统性能。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本发明实施例中日志级别动态调整方法的流程图;

图2为本发明实施例中日志级别动态调整组件的结构示意图;

图3为本发明实施例中计算机可读存储介质的结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

参考图1所示,本发明实施例提供的一种日志级别动态调整方法,应用于添加有日志级别动态调整组件的宿主应用,基于启动后的日志级别动态调整组件执行的步骤包括:

首先,执行s101、识别出宿主应用当前绑定的日志框架,并加载与宿主应用当前绑定的日志框架相匹配的日志管理接口的实现类、以及与宿主应用当前绑定的日志框架相匹配的日志修改接口的实现类。

识别出宿主应用当前绑定的日志框架为log4j日志框架、log4j2日志框架和logback日志框架中的一种。

具体的,在宿主应用启动之后,日志级别动态调整组件根据slf4j绑定的日志框架相匹配的日志管理接口的实现类、以及根据slf4j绑定的日志框架相匹配的日志修改接口的实现类。

在具体实施过程中,日志管理接口即为loggerregistry接口。其中,loggerregistry接口的实现类中提供了对日志(logger)对象的日志级别进行批量修改的逻辑,以实现对日志对象的日志级别进行批量修改。

日志修改接口即为loggerconverter接口,其中,loggerconverter接口的实现类提供了日志对象的日志级别到统一日志级别映射的解析、还提供了日志级别的具体修改。

具体的,加载日志上下文接口(即logcontext接口,logcontext接口定义了对日志级别进行动态调整的上下文)的实现类,识别出宿主应用当前绑定的日志框架;调用日志上下文接口的实现类中的方法,以根据宿主应用当前绑定的日志框架实例化日志管理接口的实现类,以及实例化日志修改接口的实现类。

在具体实施过程中,logcontext接口可以定义如下:

其中,在logcontext接口的定义中,包括所述日志管理接口的实现类中的日志管理方法的各个具体方法,其中,包括loadloggers方法、loggertype方法、listloggers方法、batchupdateloggerlevel方法。

loadloggers方法用于加载宿主应用使用的所有日志对象到目标容器中。在本发明实施例中,可以使用hashmap作为保存日志对象的目标容器。需要说明的是,hashmap为一种java数据结构,在具体实施过程,loadloggers方法会委托loggerregistry接口的实现类对象,由受委托的loggerregistry接口的实现类对象执行加载宿主应用使用的所有日志对象到目标容器的操作,该加载宿主应用使用的所有日志对象到目标容器的操作具体在s102中执行。

通过执行loggertype方法返回宿主应用当前绑定的日志框架的类型。

通过执行listloggers方法返回宿主应用使用的所有日志对象。其中,listloggers方法会委托loggerregistry接口的实现类对象,由受委托的loggerregistry接口对应的实现类对象执行返回宿主应用使用的所有日志对象的操作,该返回宿主应用使用的所有日志对象的操作具体在s102中执行。

在logcontext接口的定义中,还通过执行batchupdateloggerlevel方法批量修改日志对象的日志级别,该batchupdateloggerlevel方法具有一个用于表示需要修改的日志对象和需要修改成的日志级别的参数:loggerlistvo<loggernamelevelpair>loggers。在具体实施过程中,batchupdateloggerlevel方法会委托loggerregistry接口的实现类对象执行批量修改日志对象的日志级别的操作,该批量修改日志对象的日志级别的操作具体在s102中执行。

在s101之后,执行s102:调用日志管理接口的实现类中的日志管理方法,以加载日志框架所管理的所有日志对象至目标容器中,并从目标容器中取出日志框架所管理的所有日志对象。

由受委托的loggerregistry接口的实现类对象,调用loggerregistry接口,举例来讲,loggerregistry的接口定义如下:

通过loadloggers方法加载宿主应用使用的所有的日志对象到目标容器中,参数iloggerfactory对应为日志框架是slf4j提供的日志工厂接口,通过该日志框架slf4j提供的日志工厂接口可以获取部分日志实现框架所管理的日志对象。currentloggertype方法用于返回宿主应用当前绑定的日志框架的类型。listloggers方法用于返回宿主应用使用的所有日志对象。batchupdateloggerlevel方法用于批量修改日志对象的日志级别。

为了实现批量修改日志对象的日志级别,在s102之后,接着执行s103:调用日志修改接口的实现类中的日志修改方法,以对从目标容器中取出的日志框架管理的所有日志对象中需要修改日志级别的日志对象,进行修改日志级别。

loggerconverter的接口定义如下:

其中,levelfromlogger方法用于将宿主应用当前绑定的日志框架所管理的日志对象的日志级别转换成统一日志级别。该levelfromlogger方法具有2个参数:一个参数objectlogger表示宿主应用当前绑定的日志框架的日志对象,另一个参数loggertypeloggertype表示宿主应用当前绑定的日志框架。

changeloggerlevel方法用于具体修改日志框架所管理的日志对象的日志级别,该changeloggerlevel方法有3个参数,分别是:objectlogger,表示宿主应用当前绑定的日志框架的日志对象;unifiedloggerlevellevel,表示日志对象需要修改为的日志级别,即指定日志级别;loggertypeloggertype,表示宿主应用当前绑定的日志框架的类型。通过该changeloggerlevel方法,将日志对象的日志级别修改为unifiedloggerlevellevel参数指定的日志级别。

在识别出宿主应用当前绑定的日志框架之前,还包括:检测到宿主应用启动时,日志级别动态调整组件跟随宿主应用启动,基于日志级别动态调整组件实例化日志上下文接口和启动日志服务器,其中,日志服务器对外提供用于查询和修改日志级别的接口。由于查询和修改日志级别的接口,使得可以通过日志级别管理平台查询某个宿主应用的使用的日志对象和动态修改该宿主应用使用的日志对象的日志级别。

在具体实施过程中,在检测到宿主应用启动时,基于在日志级别动态调整组件中添加的清单文件(manifest.mf)启动日志级别动态调整组件。

其中,在manifest.mf文件中的配置信息包括manifest属性,其manifest属性中的premain-class项设置为日志级别动态调整组件相应的启动类的名称。该启动类需要提供签名为publicstaticvoidpremain(stringargs,instrumentationinst的方法。

在需要添加日志级别动态调整组件的宿主应用的启动脚本中添加-javaagent参数。举例来说,可通过以下代码实现:

java-javaagent:${app_home}/dynamic_update_logger.jar

-jarapp.jar

其中,${app_home}表示日志级别动态调整组件打包后所在的目录,app表示需要添加日志基本动态调整组件的宿主应用,从而实现跟随宿主应用启动日志级别动态调整组件。

原有的技术方案是将日志动态获取的逻辑放到一个通用的项目中,其它项目如果要接入该功能,必须将这个通用的项目作为自己的父项目。这就在一定程度上给开发者造成很多不便。而本发明实施例通过志级别动态调整组件,基于javaagent机制为宿主应用提供了日志级别动态调整组件的日志级别动态调整功能,对宿主应用无侵入性。

本发明实施例适配目前主流的日志框架:log4j、log4j2和logback日志框架。从而使得志级别动态调整组件使用的范围更加的广泛,支持扩展且扩展对宿主应用无感知,而本发明实施例应用的开发人员无需关心日志级别动态调整组件如何启动和配置。

需要说明的是,在本发明实施例中,使用slf4j(thesimpleloggingfacadeforjava)日志门面打印宿主应用在运行过程中产生的日志。

日志级别动态调整基于javaagent方式为应用提供日志级别动态调整的功能。

基于同一发明构思,本发明实施例提供一种日志级别动态调整组件,添加在宿主应用中,参考图2所示,本发明实施例提供的日志级别动态调整组件包括:

日志框架识别单元201,用于识别出所述宿主应用当前绑定的日志框架,并加载与所述日志框架相匹配的日志管理接口的实现类以及所述日志框架相匹配的日志修改接口的实现类;

日志对象获取单元202,用于调用所述日志管理接口的实现类中的日志管理方法,以加载所述日志框架管理的所有日志对象至目标容器中,并从所述目标容器中取出所述日志框架管理的所有日志对象;

日志级别修改单元203,用于调用所述日志修改接口的实现类中的日志修改方法,以对从所述目标容器中取出的所述日志框架管理的所有日志对象中需要修改日志级别的日志对象,进行修改日志级别。

可选的,本发明实施例提供的组件还包括:

启动单元,用于在所述识别出所述宿主应用当前绑定的日志框架之前,检测到所述宿主应用启动时,将所述日志级别动态调整组件跟随所述宿主应用启动,基于所述日志级别动态调整组件实例化日志上下文接口和启动日志服务器,其中,所述日志服务器对外提供用于查询和修改日志级别的接口。

进一步的,在本发明实施例中,启动单元具体用于:检测到所述宿主应用启动时,基于在所述日志级别动态调整组件中添加的清单文件启动所述日志级别动态调整组件。

进一步的,在本发明实施例中,所述日志框架识别单元201具体用于:

加载所述日志上下文接口的实现类;

识别所述宿主应用当前绑定的日志框架;

调用所述日志上下文接口的实现类中的方法,以根据所述宿主应用当前绑定的日志框架实例化所述日志管理接口的实现类,以及实例化所述日志修改接口的实现类。

进一步的,在本发明实施例中,所述日志管理接口中至少定义有如下函数:

用于加载所述宿主应用使用的所有的日志对象到目标容器中的函数,和

用于返回所述宿主应用当前绑定的日志框架的类型的函数,和

用于批量修改日志对象的日志级别的函数。

进一步的,在本发明实施例中,所述日志修改接口中至少定义有如下函数:

将所述宿主应用当前绑定的日志框架的日志对象的日志级别转换成统一日志级别的函数,和

将所述宿主应用当前绑定的日志框架的日志对象的日志级别分别修改成指定日志级别的函数。

基于同一发明构思,本发明实施例提供了一种计算机可读存储介质301,其上存储有计算机程序302,该程序302包括添加有日志级别动态调整组件的宿主应用,该程序302被处理器执行时实现前述日志级别动态调整方法中任一实施方式所述的步骤,为了说明书的简洁,本文不再赘述。

基于同一发明构思,本发明实施例提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,该程序包括添加有日志级别动态调整组件的宿主应用,所述处理器执行所述程序时实现前述日志级别动态调整方法中任一实施方式所述的步骤,为了说明书的简洁,本文不再赘述。

本发明实施例提供的一个或多个技术方案,至少实现了如下技术效果或优点:

通过开发了日志级别动态调整组件,识别出宿主应用当前绑定的日志框架,并加载与分别日志框架相匹配的日志管理接口的实现类、日志修改接口的实现类;调用日志管理接口的实现类中的日志管理方法,以加载日志框架所管理的所有日志对象至目标容器中,从目标容器中取出日志框架所管理的所有日志对象;调用日志修改接口的实现类中的日志修改方法,以对从目标容器中取出的日志框架管理的所有日志对象中需要修改日志级别的日志对象,进行修改日志级别,从而通过该日志级别动态调整组件可以在需要解决宿主应用的线上问题时实时调整线上日志的输出级别,以能够获取该宿主应用全面的调试日志,提高了定位宿主应用的线上问题的效率,同时又不会使日志量暴增,因此不会降低系统性能。

在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的各描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。

在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。

类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。

本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。

此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。

本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(dsp)来实现根据本发明实施例的智能摄像系统以及网络摄像头中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者系统程序(如计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。

应该注意的是,上述各实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应该将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或者步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干系统的单元权利要求中,这些系统中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二以及第三等的使用不表示任何顺序。可将这些单词解释为名称。

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