***日志的格式转换方法、装置、电子设备及计算机介质
技术领域
本公开涉及计算机技术领域,具体而言,涉及一种***日志的格式转换方法、***日志的格式转换装置、电子设备及计算机可读介质。
背景技术
***日志是记录***中硬件、软件和***问题的信息,用户可以通过它来进行错误排查,还能完成跟踪调试、程序状态记录、崩溃数据恢复等工作,***日志是***管理的重要组成部分。
当主***与子***分别使用不同的日志组件时,会导致主***在引用子***输出日志时产生几种不同格式的日志,而日志格式不统一或者需要的关键信息丢失,会对开发、测试、运维人员进行日志分析和问题排查造成很大困难。
因此,目前亟需一种日志统一集成方案,使子***与主***的日志格式保持一致。
需要说明的是,在上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。
发明内容
本公开的目的在于提供一种***日志的格式转换方法、***日志的格式转换装置、电子设备及计算机可读介质,进而至少在一定程度上克服由于***日志输出方法的限制而导致的子***与主***输出的日志格式不统一等问题。
根据本公开的第一个方面,提供一种***日志的格式转换方法,包括:
接收主***所引用的多个子***的日志模块输出的子***日志,并根据所述子***日志确定各个子***的日志模块所使用的***日志组件;
获取用于***日志格式转换的转换接口,并根据所述子***的日志模块所使用的***日志组件确定所述转换接口中对应于各个子***日志模块的桥接器。
在本公开的一种示例性实施例中,所述分别通过对应于各个子***日志模块的所述桥接器对所述子***日志进行格式转换,包括:
删除所述子***日志模块中的日志处理器;
将对应于各个子***日志模块的所述桥接器作为新的日志处理器添加到所述子***的日志模块中;
通过所述桥接器将所述子***日志的格式转换为所述主***日志的格式。
在本公开的一种示例性实施例中,所述子***的日志模块所使用的***日志组件包括第一日志组件和第二日志组件,所述删除所述子***日志模块中的日志处理器,包括:
若所述子***的日志模块所使用的***日志组件为第一日志组件,则删除所述子***日志模块中的所述日志处理器;
若所述子***的日志模块所使用的***日志组件为第二日志组件,则删除所述子***日志模块中包括所述日志处理器的日志处理模块。
在本公开的一种示例性实施例中,所述将对应于各个子***日志模块的所述桥接器作为新的日志处理器添加到所述子***的日志模块中,包括:
若所述子***的日志模块所使用的***日志组件为第一日志组件,则将所述桥接器作为新的日志处理器添加到所述子***的日志模块中;
若所述子***的日志模块所使用的***日志组件为第二日志组件,则将包括所述桥接器的桥接模块作为新的日志处理模块添加到所述子***的日志模块中。
在本公开的一种示例性实施例中,所述通过所述桥接器将所述子***日志的格式转换为所述主***日志的格式,包括:
获取所述主***日志模块中的日志配置文件;
若所述子***的日志模块所使用的***日志组件为第一日志组件,则通过所述桥接器使用所述主***日志模块中的日志配置文件输出与主***日志具有相同格式的子***日志;
若所述子***的日志模块所使用的***日志组件为第二日志组件,则通过包括所述桥接器的桥接模块使用所述主***日志模块中的日志配置文件输出与主***日志具有相同格式的子***日志。
在本公开的一种示例性实施例中,所述第一日志组件包括***开发工具包的内置日志组件。
在本公开的一种示例性实施例中,所述第二日志组件包括第三方服务器软件的日志组件。
根据本公开的第二方面,提供一种***日志的格式转换装置,包括:
日志组件确定模块,用于接收主***所引用的多个子***的日志模块输出的子***日志,并根据所述子***日志确定各个子***的日志模块所使用的***日志组件;
桥接器确定模块,用于获取用于***日志格式转换的转换接口,并根据所述子***的日志模块所使用的***日志组件确定所述转换接口中对应于各个子***日志模块的桥接器;
日志格式转换模块,用于分别通过对应于各个子***日志模块的所述桥接器对所述子***日志进行格式转换,输出与所述主***的***日志具有相同格式的子***日志。
根据本公开的第三方面,提供一种电子设备,包括:处理器;以及存储器,用于存储所述处理器的可执行指令;其中,所述处理器配置为经由执行所述可执行指令来执行上述任意一项所述的***日志的格式转换方法。
根据本公开的第四方面,提供一种计算机可读介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任意一项所述的***日志的格式转换方法。
本公开示例性实施例可以具有以下有益效果:
本公开示例实施方式的***日志的格式转换方法中,通过提供用于***日志格式转换的转换接口,可以在不改动子***现有日志组件的情况下,将子***的日志组件适配到统一的日志框架上,一方面,可以使子***统一按照主***的日志格式输出***日志,形成日志格式的一致性,避免日志信息的丢失;另一方面,日志格式的统一可以为开发、测试、运维人员进行日志分析和问题排查提供很大便利,遇到问题后能够根据统一日志迅速进行排查分析,避免浪费宝贵的排错时间。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出了本公开示例实施方式的***日志的格式转换方法的流程示意图;
图2示出了本公开示例实施方式的子***日志的格式转换方法的流程示意图;
图3示出了本公开示例实施方式的删除子***原始日志处理器的流程示意图;
图4示出了本公开示例实施方式的子***日志模块中添加桥接器的流程示意图;
图5示出了本公开示例实施方式的通过桥接器输出***日志的流程示意图;
图6示出了根据本公开的一个具体实施例中***日志的格式转换方法的流程示意图;
图7示出了本公开示例实施方式的***日志的格式转换装置的框图;
图8示出了适于用来实现本公开实施方式的电子设备的计算机***的结构示意图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本公开将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。在下面的描述中,提供许多具体细节从而给出对本公开的实施方式的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而省略所述特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知技术方案以避免喧宾夺主而使得本公开的各方面变得模糊。
此外,附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
本示例实施方式首先提供了一种***日志的格式转换方法。参考图1所示,上述***日志的格式转换方法具体可以包括以下步骤:
步骤S110.接收主***所引用的多个子***的日志模块输出的子***日志,并根据子***日志确定各个子***的日志模块所使用的***日志组件。
本实例实施方式中,子***是一种模型元素,它具有包(其中可包含其他模型元素)和类(其具有行为)的语义。子***的行为由它所包含的类或其他子***提供。主***通过引用一个或多个子***,从而得到一个完整的,拥有多种功能的***。例如,在一个购物小程序中,主***A是购物***,子***B是登录***,子***C是权益***,子***D是消息中心***,主***A通过调用子***B、子***C和子***D,从而实现一个购物小程序的完整功能。
应用主***A引用***B,***C,***D三个子***,每个子***的日志模块都有一套自己的日志实现组件,且子***引入到主***后,主***没有权限对其进行改动。
具体地说,例如,主***A使用logback组件,其中logback是Apache的一个开源日志组件,它的架构非常的通用,适用不同的使用场景,比其它所有的日志***更快并且更小,包含了许多独特并且有用的特性。使用logback输出的日志格式为:2019-07-10 17:25:09INFO[main]com.logtest.logback.LogbackTest.logbackTest[11]行---在logbackTest1里---。
子***B使用jdklog组件,其中jdklog是Java开发工具包中自带的日志组件,使用jdklog输出的日志格式为:七月10,2019 5:27:45下午com.logtest.jdklog.JdkLogTestjdkLogTest信息:---在jdkLogTest里---。
子***C使用log4j组件,其中log4j也是Apache的一个开源日志组件,使用logback输出的日志格式为:[11]行INFO[main]2019-07-10 17:29:55.712----在log4jTest里----。
子***D使用log4j2组件,其中log4j2是log4j的改进版日志组件,使用log4j2输出的日志格式为:INFO[main]com.logtest.log4j2.Log4j2Test.log4j2Test---在log4j2Test里---。
如上述的实例所示,子***B输出的日志,日期格式与常规不太符合,视觉体验差;子***C输出的日志,没有具体指出日志的输出类,缺失关键信息;子***D输出的日志,没有输出具体出现日志的时间,缺少日志发生的时间点。如果主***A与子***B、C、D分别使用不同的日志组件,会导致主***在引用子***输出日志时产生4种不同格式的日志。因此,需要进行日志格式的转换,使主***与子***输出的日志格式得到统一。
通过获取多个子***所输出的***日志,并判断各个子***所使用的日志组件的种类,可以根据子***所使用的日志组件的种类确定子***在进行格式转换时需要使用的方法。
步骤S120.获取用于***日志格式转换的转换接口,并根据子***的日志模块所使用的***日志组件确定转换接口中对应于各个子***日志模块的桥接器。
用于***日志格式转换的转换接口,即简单日志门面slf4j(Simple LoggingFacade for Java),它可以提供统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志***的配置来实现,因此可以在应用中灵活切换日志***。通常***都会采用统一的日志组件,slf4j在易用性、可适配性、可移植性方面的性能都比较优异,是最常用的日志转换接口。
由于项目中引用或关联的子***项目采用的一些日志组件各种各样,为了保证日志的统一配置管理,且不改动现有日志组件代码,需将子***的日志组件适配到slf4j日志框架上。
例如,在***中使用log4j的应用程序编程接口进行编程,但是最终想通过logback来进行日志输出,所以需要先将log4j的日志输出转交给slf4j,再由slf4j转交给logback进行输出。将log4j1的输出转给slf4j,这就是桥接器所做的工作,主要用来进行实际的日志框架之间的切换。
在使用slf4j时,如果需要使用某一种日志实现,那么必须根据所使用的日志组件的种类,来选择slf4j中正确的桥接器或包含桥接器的桥接模块,即工具转换包(jar包)的集合。
步骤S130.分别通过对应于各个子***日志模块的桥接器对子***日志进行格式转换,输出与主***的***日志具有相同格式的子***日志。
本示例实施方式中,若子***使用jdk(java开发工具包)的内置日志模块java.util.logging.Logging来处理日志,选择slf4j中的jul-to-slf4j.jar包来切换子***的日志框架,通过jul-to-slf4j.jar包中的SLF4JBridgeHandler类继承java.util.logging.Handler处理器来处理程序。
若子***使用Log4j日志模块来处理日志,核心类有org.apache.log4j.Category,org.apache.log4j.Logger,org.apache.log4j.Priority,org.apache.log4j.Level,org.apache.log4j.MDC,和org.apache.log4j.BasicConfigurator。这些类都通过slf4j中的log4j-over-slf4j.jar包重定向到slf4j相应的类中。
若子***使用log4j2日志模块来处理日志,其核心类通过slf4j中的log4j-to-slf4j.jar包重定向到slf4j相应的类中,即核心类org.apache.logging.log4j.core.Log4jContextFactory被重定向成org.apache.logging.slf4j.SLF4JloggerContextFactory,核心类org.apache.logging.log4j.core.Logger被重定向成org.apache.logging.slf4j.SLF4JLogger。
最后,由主***使用slf4j+logback统一输出主***与各个子***的***日志,达成日志格式的统一。
下面,结合图2至图5对本示例实施方式的上述步骤进行更加详细的说明。
在步骤S130中,如图2所示,分别通过对应于各个子***日志模块的桥接器对子***日志进行格式转换的方法具体可以包括以下几个步骤:
步骤S210.删除子***日志模块中的日志处理器。
删除子***日志模块中的原始日志处理器,若子***使用的日志组件为jdk自带的日志组件,则只需要删除日志处理器;若子***使用的日志组件不是jdk自带的日志组件,则需要删除包含有日志处理器的原始工具包。
步骤S220.将对应于各个子***日志模块的桥接器作为新的日志处理器添加到子***的日志模块中。
删除子***日志模块中的原始日志处理器或包含日志处理器的原始工具包之后,加入日志接口中与各个子***对应的桥接器,使子***的日志处理类使用新的桥接器中的处理类。若子***使用的日志组件为jdk自带的日志组件,则只需要添加新的桥接器;若子***使用的日志组件不是jdk自带的日志组件,则需要添加包含桥接器的桥接模块。
步骤S230.通过桥接器将子***日志的格式转换为主***日志的格式。
本示例实施方式中,通过简单日志门面slf4j提供统一的日志接口,并通过slf4j中对应于各个子***的桥接器或桥接模块将子***的日志组件适配到slf4j日志框架上,最后通过slf4j与主***所使用的日志组件输出主***与各个子***的***日志,使日志格式保持统一。
在步骤S210中,如图3所示,删除子***日志模块中的日志处理器具体可以包括以下几个步骤:
步骤S310.若子***的日志模块所使用的***日志组件为第一日志组件,则删除子***日志模块中的日志处理器。
第一日志组件包括***开发工具包的内置日志组件,即jdk自带的日志组件。删除第一日志组件的日志处理器,即删除注册到jul root logger(java内置日志模块的根记录器)的现有handler处理器。
具体实现代码为:SLF4JBridgeHandler.removeHandlersForRootLogger()。
步骤S320.若子***的日志模块所使用的***日志组件为第二日志组件,则删除子***日志模块中包括日志处理器的日志处理模块。
第二日志组件包括第三方服务器软件的日志组件,即Apache所开发的开源日志组件,包括log4j、log4j2、logback等。
若子***的日志模块所使用的***日志组件为log4j日志组件,则删除子***所依赖的包含有日志处理器的原始工具包log4j-X.jar。
若子***的日志模块所使用的***日志组件为log4j2日志组件,则删除子***所依赖的包含有日志处理器的原始工具包log4j-core-X.jar,log4j-api-X.jar。
在步骤S220中,如图4所示,将对应于各个子***日志模块的桥接器作为新的日志处理器添加到子***的日志模块中具体可以包括以下几个步骤:
步骤S410.若子***的日志模块所使用的***日志组件为第一日志组件,则将桥接器作为新的日志处理器添加到子***的日志模块中。
若子***的日志模块所使用的***日志组件为第一日志组件,即jdk自带日志组件,则将桥接器SLF4JBridgeHandler添加到jul(java内置日志模块)的根记录器中。这样子***就可以使用SLF4JBridgeHandler处理器来输出日志。
具体实现代码为:SLF4JBridgeHandler.install()。
步骤S420.若子***的日志模块所使用的***日志组件为第二日志组件,则将包括桥接器的桥接模块作为新的日志处理模块添加到子***的日志模块中。
若子***的日志模块所使用的***日志组件为第二日志组件,即Apache所开发的开源日志组件,则排除子***之前使用的包含有日志处理器的原始工具包,加入包含有桥接器的新的桥接模块,并使新的桥接模块与原始工具包处理使用的类名完全相同。这样子***的日志处理类就使用成了新的桥接模块的处理类。
若子***的日志模块所使用的***日志组件为log4j日志组件,则添加包含有桥接器的新的桥接模块log4j-over-slf4j.jar。
若子***的日志模块所使用的***日志组件为log4j2日志组件,则添加包含有桥接器的新的桥接模块log4j-to-slf4j.jar。
在步骤S230中,如图5所示,通过桥接器将子***日志的格式转换为主***日志的格式具体可以包括以下几个步骤:
步骤S510.获取主***日志模块中的日志配置文件。
获取主***日志模块中的日志配置文件,并添加在类路径下。若主***使用logback日志组件,则在类路径下加入logback的配置文件。
步骤S520.若子***的日志模块所使用的***日志组件为第一日志组件,则通过桥接器使用主***日志模块中的日志配置文件输出与主***日志具有相同格式的子***日志。
若子***的日志模块所使用的***日志组件为第一日志组件,即jdk自带日志组件,则在桥接后,***将不使用原jdk默认的配置文件logging.porperties配置文件,而是通过给新的处理类使用配置的方式,增加子***到主***的日志桥接工具包,统一使用主***的日志配置文件,输出与主***日志格式完全相同的***日志。若主***使用logback日志组件,则使用主***的logback.xml配置文件。
步骤S530.若子***的日志模块所使用的***日志组件为第二日志组件,则通过包括桥接器的桥接模块使用主***日志模块中的日志配置文件输出与主***日志具有相同格式的子***日志。
若子***的日志模块所使用的***日志组件为第二日志组件,即Apache所开发的开源日志组件,则同样增加子***到主***的日志桥接工具包,统一使用主***的日志配置文件,输出与主***日志格式完全相同的***日志。
例如,若子***的日志模块所使用的***日志组件为log4j日志组件,桥接后,则不再使用log4j的配置文件log4j.properties配置文件,而统一使用主***的logback.xml配置文件。
子***的日志模块所使用的***日志组件为log4j2日志组件,桥接后,不则再使用log4j2的配置文件log4j2.xml配置文件,而统一使用主***的logback.xml配置文件。
如图6所示是本公开的一个具体实施例中的***日志的格式转换方法的框图,是对本示例实施方式中的上述步骤的举例说明,该框图描述的***日志的格式转换方法的基本过程如下:
子***601包括B***、C***和D***,其中各个子***使用的日志组件分别为:B***使用jdk自带组件602,C***使用log4j日志组件603,D***使用log4j2日志组件604。通过简单日志门面slf4j提供统一的日志接口605,将子***的日志组件适配到slf4j日志框架上。B***通过步骤S606将jdk自带组件602适配到slf4j日志框架上,C***通过步骤S607将log4j日志组件603适配到slf4j日志框架上,D***通过步骤S608将log4j2日志组件604适配到slf4j日志框架上,最后统一通过A***609,使用logback日志组件610输出***日志,以使子***B、C、D和主***A的日志格式完全相同。
应当注意,尽管在附图中以特定顺序描述了本公开中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。
进一步的,本公开还提供了一种***日志的格式转换装置。参考图7所示,该***日志的格式转换装置可以包括日志组件确定模块710、桥接器确定模块720以及日志格式转换模块730。其中:
日志组件确定模块710可以用于接收主***所引用的多个子***的日志模块输出的子***日志,并根据子***日志确定各个子***的日志模块所使用的***日志组件;
桥接器确定模块720可以用于获取用于***日志格式转换的转换接口,并根据子***的日志模块所使用的***日志组件确定转换接口中对应于各个子***日志模块的桥接器;
日志格式转换模块730可以用于分别通过对应于各个子***日志模块的桥接器对子***日志进行格式转换,输出与主***的***日志具有相同格式的子***日志。
在本公开的一些示例性实施例中,日志格式转换模块730可以包括处理器删除单元、桥接器添加单元以及格式转换单元。其中:
处理器删除单元可以用于删除子***日志模块中的日志处理器;
桥接器添加单元可以用于将对应于各个子***日志模块的桥接器作为新的日志处理器添加到子***的日志模块中
格式转换单元可以用于通过桥接器将子***日志的格式转换为主***日志的格式。
在本公开的一些示例性实施例中,处理器删除单元可以包括第一处理器删除单元以及第二处理器删除单元。其中:
第一处理器删除单元可以用于若子***的日志模块所使用的***日志组件为第一日志组件,则删除子***日志模块中的日志处理器;
第二处理器删除单元可以用于若子***的日志模块所使用的***日志组件为第二日志组件,则删除子***日志模块中包括日志处理器的日志处理模块。
在本公开的一些示例性实施例中,桥接器添加单元可以包括第一桥接器添加单元以及第二桥接器添加单元。其中:
第一桥接器添加单元可以用于若子***的日志模块所使用的***日志组件为第一日志组件,则将桥接器作为新的日志处理器添加到子***的日志模块中;
第二桥接器添加单元可以用于若子***的日志模块所使用的***日志组件为第二日志组件,则将包括桥接器的桥接模块作为新的日志处理模块添加到子***的日志模块中。
在本公开的一些示例性实施例中,格式转换单元可以包括配置文件获取单元、第一日志输出单元以及第二日志输出单元。其中:
配置文件获取单元可以用于获取主***日志模块中的日志配置文件;
第一日志输出单元可以用于若子***的日志模块所使用的***日志组件为第一日志组件,则通过桥接器使用主***日志模块中的日志配置文件输出与主***日志具有相同格式的子***日志;
第二日志输出单元可以用于若子***的日志模块所使用的***日志组件为第二日志组件,则通过包括桥接器的桥接模块使用主***日志模块中的日志配置文件输出与主***日志具有相同格式的子***日志。
上述***日志的格式转换装置中各模块/单元的具体细节在相应的方法实施例部分已有详细的说明,此处不再赘述。
图8示出了适于用来实现本发明实施例的电子设备的计算机***的结构示意图。
需要说明的是,图8示出的电子设备的计算机***800仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图8所示,计算机***800包括中央处理单元(CPU)801,其可以根据存储在只读存储器(ROM)802中的程序或者从存储部分808加载到随机访问存储器(RAM)803中的程序而执行各种适当的动作和处理。在RAM 803中,还存储有***操作所需的各种程序和数据。CPU801、ROM 802以及RAM 803通过总线804彼此相连。输入/输出(I/O)接口805也连接至总线804。
以下部件连接至I/O接口805:包括键盘、鼠标等的输入部分806;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分807;包括硬盘等的存储部分808;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分809。通信部分809经由诸如因特网的网络执行通信处理。驱动器810也根据需要连接至I/O接口805。可拆卸介质811,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器810上,以便于从其上读出的计算机程序根据需要被安装入存储部分808。
特别地,根据本发明的实施例,下文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分809从网络上被下载和安装,和/或从可拆卸介质811被安装。在该计算机程序被中央处理单元(CPU)801执行时,执行本申请的***中限定的各种功能。
需要说明的是,本公开所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的***、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行***、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行***、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本公开各种实施例的***、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的***来实现,或者可以用专用硬件与计算机指令的组合来实现。
作为另一方面,本申请还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该电子设备执行时,使得该电子设备实现如下述实施例中所述的方法。例如,所述的电子设备可以实现如图1所示的各个步骤。
应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块的特征和功能可以在一个模块中具体化。反之,上文描述的一个模块的特征和功能可以进一步划分为由多个模块来具体化。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。