具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
转向附图,其中相同的参考标号指代相同的元素,本发明的原理被示为在一个合适的计算环境中实现。以下描述基于所述的本发明的实施例,并且不应认为是关于此处未明确描述的替换实施例而限制本发明。
图1是根据本发明实施例的日志记录的处理方法流程示意图;图2是根据本发明实施例的日志记录的处理方法的详细流程图。
如图1所示该方法包括如下步骤:
步骤S102,在ETL包中配置需要输出的日志记录,获取日志输出表;
步骤S104,获取需要增加到日志中的日志记录值,日志包括至少一条日志行。
步骤S106,调用定制日志函数,将需要增加到日志中的日志记录值输出到ETL包运行的日志行中。
步骤S108,从日志行中提取日志记录值和执行编码值。
步骤S110,创建日志记录值与执行编码值的关联关系。
步骤S112,从日志输出表中查询得到具有相同执行编码值的日志行。
步骤S114,根据日志记录值与执行编码值的关联关系,将日志记录值添加到日志输出表中具有相同执行编码值的日志行中。
本申请上述实施例通过定制日志函数来将需要添加的日志记录值输出到ETL包运行的日志行中,然后根据日志记录值与固有的参数执行编码值之间的关联关系,使得在ETL包运行输出日志输出表时,将日志记录值添加到日志输出表中所有具有相同执行编码值的日志行中。从而可以实现对日志输出表的扩展,即派生一个日志列,该日志列保存了按用户需求添加的日志记录值。由此可知,本申请上书实施例解决了相关技术的由于无法自定义ETL包运行时输出的日志信息,导致用户无法高效应用或处理日志信息的问题,进而实现可以根据用户需求在输出的日志信息中派生新的日志列,从而达到扩展日志输出表的效果。
本申请上述实施例中的添加的日志列可以根据用户的需求增加,即可以添加至少一个日志列。
具体的,以SSIS为例,当需要添加的日志信息值为客户信息时,例如客户标识(ProfileID),本申请可以在原来的日志输出表中扩展出来一列来添加客户信息,从而用户可以获知哪些日志输出是对应哪些客户的,从而达到扩展日志输出列的目的。
以SSIS为例,在ETL包运行时,SSIS日志(SSISLogging)的日志Logging配置里可供选择的日志输出表可以包括如下日志列:Computer,Operation,SourceName,SourceID,ExecutionID,MessageText,DataBytes。其中,ExecutionID的类型为GUID,表示一次ETL运行的唯一标识,用于区分多次ETL运行记录,并且在一次ETL运行里,各输出日志行里该ExecutionID列的值是一致的;MessageText为消息信息,相当于详细信息列。下面就在上述日志输出表中添加一个新日志列[例如客户标识(ProfileID)]为例来详细描述本申请,其中,客户标识(ProfileID)可以表示当前ETL包运行所对应的特定客户信息标识。
如图3所示,首先,本申请需要通过编辑ETL包来实现SSIS配置日志,包括ETL包固有的日志记录以及需要添加的自定义日志记录(例如客户信息标识);然后,运行ETL包,输出配置的日志所产生的日志行(即固有的日志记录),及特定的带有派生列值的日志行(需要添加的自定义日志记录);最后,将添加日志派生列,从而派生列中的日志记录值添加到日志中。
具体的,固有的日志记录可以通过选择SSISLogging里用户需要的日志事件及相关的日志列(包含Message列)来获取到,需要派生添加的日志记录可以通过在ETL包中添加相应的Script Component控件,以及在Script Component控件里添加相应的程序代码,从而在运行ETL包时可以找到需要派生的日志记录列的值。
下面就如何实现上述添加的日志信息的派生过程进行详细描述。
本申请上述实施例中,在ETL包中配置需要派生的日志列的过程中,需要通过步骤S102获取需要增加到日志中的日志记录值,并通过步骤S104来实现输出一特定的日志行,将获取到的日志记录值保存在预定的一日志列中。
上述步骤S102可以包括如下步骤:
首先,获取ETL包所关联的数据库。具体的,每一个ETL包运行过程中都对应一个关联的数据库,该数据库用于保存ETL对数据进行抽取、转换并加载后的结果。即与某一个ETL包关联的数据库保存有多张数据表,用于保存各个日志列的数据。
然后,从数据库中获取ETL包对应的日志记录值。具体的,该步骤可以通过在ETL包中添加ScriptComponent控件(SSIS里的控件,用于编写c#等代码所用),并在控件里编写代码,根据商务逻辑找到ProfileID列,此处的商务逻辑是指系统查询得到日志记录值(例如客户信息ProfileID)的实现过程,即实现从数据库中获取ETL包对应的日志记录值的的业务逻辑。
例如,由于每个ETL包关联的数据库都具有一个数据库名称,且该数据库名程包含了可以唯一表示当前数据库的编码ProfileID,可以通过该ProfileID来表征当前ETL包的客户信息。因此,可以通过如下步骤来实现从数据库中获取ETL包对应的日志记录值的步骤:获取数据库的名称;从数据库名称中提取表征日志记录值的字符串,以获取日志记录值。由此,可以实现通过连接字符串的数据库名称来找到ETL包所对应的客户信息。需要注意的是,上述方法是本发明的一种示例,本发明还可以通过各种变量或者执行时间作为唯一标识来表征ETL包客户信息。
上述实施例中的ETL包运行的日志行中可以包括一消息文本列,通过将消息文本列的值设置为需要增加到日志中的日志记录来获取需要增加的日志记录值。由此可知,ETL包执行时,通过程序动态获取到扩展列的信息,即派生的客户信息,此扩展信息由具体的业务逻辑所决定的。
上述步骤S104可以通过调用定制日志函数,将需要增加到日志中的日志记录值输出到ETL包运行的日志行中。其中,上述定制日志函数为添加的CustomerLogging,即利用微软提供的日志输出API在整个ETL执行前将其扩展列信息进行手动的日志输出,并将扩展列信息输出到原有字段MessageText。
具体的,上述步骤通过调用API,利用定制日志函数CustomerLogging的应用程序编程接口API来将需要派生的日志记录值输出到该ETL包运行的日志行的一日志列MessageText中,从而使得日志中的一日志行下面添加了一条特定的日志记录值,例如,在ETL包运行得到的日志行的一日志列Message下面添加一日志记录值000217(ProfileID:000217)。该日志记录值可用于表征当前ETL包的用户信息的唯一标识。需要注意的是,此处将Message列的信息设置为ProfileID:000217可以是这里通过特定的格式将ProfileID进行了输出。
由上可知,本申请通过调用SSIS CustomLogging的API,实现输出一条特定的日志行,将Message列的值设置为派生列的值(例如:ProfileID:000217)。
优选地,本申请上述实施例中,由于执行编码值ExecutionID可以作为唯一标识来表征ETL包运行后得到的日志行。因此,在完成步骤S104之后,后台可以通过步骤S106和步骤S108来获取派生的日志记录值与日志行的对应关系,具体的实现步骤如下:
步骤S106,从日志行中提取日志记录值和执行编码值。该执行编码值可以是ExecutionID。
具体的,该步骤实现了,在分析SSISLoging时,先根据日志行中的MessageText列找出已经通过API输出的具体Message列的值(如ProfileID),然后,将该Message列与本行日志记录的ExecutionID列建立关联,因此,可以通过ExecutionID列查找出这个Profile在并发执行ETL时所产生的所有日志记录值,从而执行逐行根据日志记录值添加派生列(ProfileID)。
步骤S108,创建日志记录值与执行编码值的关联关系。
本申请上述实施例中,步骤S108创建日志记录值与执行编码值的关联关系的步骤可以包括如下步骤:创建ETL对应的临时表,临时表包括日志记录值、执行编码值,以及日志记录值与执行编码值之间的对应关系。
在获取到上述步骤完成的临时表之后,系统在运行ETL包时,可以通过派生的Message列的数据行来提取与该列的值对应的执行编码值ExecutionID。
步骤S110,从日志输出表中查询得到具有相同执行编码值的日志行。
本申请上述实施例中,ETL包中配置需要输出的日志记录,并获取日志输出表的步骤可以包括如下步骤:选择ETL包中需要输出的日志事件,并选择日志事件包含的日志列;在运行SSIS包之后,获取日志输出表,其中,日志输出表包括用于填写执行编码值的日志列。
具体的,上述通过运行ETL包后,通过通过ExecutionID和MessageText(含ProfileID的特殊日志记录值)的横向关联,可以高效获取到当前ETL包所对应的需要派生的日志记录值,具体的,可以通过表连接SQL获取。
上述实施例可以通过如下相应的SQL语句实现:
上述SQL语句中sysssislog表为SSISLogging默认的日志输出表。cte_executionid_profileid表示通过Message包含的特殊值ProfileID等字样的行所提取的所有ExecutionID值与Profile值的一张临时表,采用With来定义临时表,详细语法可上MSDN直接搜Sql Cte便能清楚。而且,可以将sysssislog表与上面的表cte_executionid_profileid通过executionid列进行连接,便可方便的在表连接结果里选择表cte_executionid_profileid的列ProfileID,为表sysssislog的每行结果派生列ProfileID。
在运行ETL包,从日志输出表中查询得到具有相同执行编码值的日志行之后,可以执行步骤S112来实现添加日志派生行。
步骤S112,根据日志记录值与执行编码值的关联关系,将日志记录值添加到日志输出表中具有相同执行编码值的日志行中。在添加日志派生列的过程中,如图3所示,在运行ETL包之后,可以找到派生特殊Message列的那条数据行,并提取派生列的值与ExecutionID的值,然后,通过EexecutionID的值,为所有日志行里含有相同ExecutionID的值的日志行,添加上面找到的派生Message列的日志记录值。
本申请上述实施例中,根据日志记录值与执行编码值的关联关系,将日志记录值添加到日志输出表中具有相同执行编码值的日志行中的步骤可以包括如下步骤:根据执行编码值建立日志输出表与临时表之间的关联关系;从临时表中提取ETL包对应的日志记录值;在从日志输出表中获取到具有相同执行编码值的日志行之后,根据日志输出表与临时表之间的关联关系,将日志记录值添加到具有相同执行编码值的日志行中。
本申请上述实施例通过CustomLogging机制,利用其Message列来记录特定的派生的日志记录值的列信息,然后,通过输出特定的一行标识记录,并利用标识列与ExecutionID的关联性,达到派生列的目的。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
图3示出了可用于这些设备的一个示例计算机体系结构的示意图。出于描述的目的,所绘的体系结构仅为合适环境的一个示例,并非对本发明的使用范围或功能提出任何局限。也不应将该计算系统解释为对图3所示的任一组件或其组合具有任何依赖或需求。
本发明的原理可以使用其它通用或专用计算或通信环境或配置来操作。适用于本发明的众所周知的计算系统、环境和配置的示例包括但不限于,个人计算机、服务器,多处理器系统、基于微处理的系统、小型机、大型计算机、以及包括任一上述系统或设备的分布式计算环境。
如本发明所使用的,术语“模块”、“组件”或“单元”可以指在配置信息的更新系统200上执行的软件对象或例程。此处所描述的不同组件、模块、单元、引擎和服务可被实现为在标志位的访问系统200上执行(例如,作为单独的线程)的对象或进程。尽管此处所描述的系统和方法较佳地以软件来实现,但是硬件或软件和硬件的组合的实现也是可能并被构想的。
图3是根据本发明实施例的日志记录的处理装置的结构示意图。如图3所示,该日志记录的处理装置包括:处理模块10、获取模块20、调用模块30、提取模块40、创建模块50、查询模块60和添加模块70。
其中,处理模块10,用于在ETL包中配置需要输出的日志记录,获取日志输出表;获取模块20,用于获取需要增加到日志中的日志记录值,日志包括至少一条日志行。调用模块30,用于调用定制日志函数,将需要增加到日志中的日志记录值输出到ETL包运行的日志行中。提取模块40,用于从日志行中提取日志记录值和执行编码值。创建模块50,用于创建日志记录值与执行编码值的关联关系。查询模块60,用于从日志输出表中查询得到具有相同执行编码值的日志行。添加模块70,用于根据日志记录值与执行编码值的关联关系,将日志记录值添加到日志输出表中具有相同执行编码值的日志行中。
本申请上述实施例通过定制日志函数来将需要添加的日志记录值输出到ETL包运行的日志行中,然后根据日志记录值与固有的参数执行编码值之间的关联关系,使得在ETL包运行输出日志输出表时,将日志记录值添加到日志输出表中所有具有相同执行编码值的日志行中。从而可以实现对日志输出表的扩展,即派生一个日志列,该日志列保存了按用户需求添加的日志记录值。由此可知,本申请上书实施例解决了相关技术的由于无法自定义ETL包运行时输出的日志信息,导致用户无法高效应用或处理日志信息的问题,进而实现可以根据用户需求在输出的日志信息中派生新的日志列,从而达到扩展日志输出表的效果。
具体的,以SSIS为例,当需要添加的日志信息值为客户信息时,例如客户标识(ProfileID),本申请可以在原来的日志输出表中扩展出来一列来添加客户信息,从而用户可以获知哪些日志输出是对应哪些客户的,从而达到扩展日志输出列的目的。
以SSIS为例,在ETL包运行时,SSIS日志(SSISLogging)的日志Logging配置里可供选择的日志输出表可以包括如下日志列:Computer,Operation,SourceName,SourceID,ExecutionID,MessageText,DataBytes。其中,ExecutionID的类型为GUID,表示一次ETL运行的唯一标识,用于区分多次ETL运行记录,并且在一次ETL运行里,各输出日志行里该ExecutionID列的值是一致的;MessageText为消息信息,相当于详细信息列。下面就在上述日志输出表中添加一个新日志列[例如客户标识(ProfileID)]为例来详细描述本申请,其中,客户标识(ProfileID)可以表示当前ETL包运行所对应的特定客户信息标识。
优选地,上述实施例中的获取模块可以包括:
第一子获取模块,用于获取ETL包所关联的数据库。具体的,每一个ETL包运行过程中都对应一个关联的数据库,该数据库用于保存ETL对数据进行抽取、转换并加载后的结果。即与某一个ETL包关联的数据库保存有多张数据表,用于保存各个日志列的数据。
第二子获取模块,用于从数据库中获取ETL包对应的日志记录值,其中,该第二子获取模块包括:读取模块,用于读取数据库的名称;第一提取模块,用于从数据库名称中提取表征日志记录值的字符串,以获取日志记录值。具体的,该步骤可以通过在ETL包中添加ScriptComponent控件(SSIS里的控件,用于编写c#等代码所用),并在控件里编写代码,根据商务逻辑找到ProfileID列,此处的商务逻辑是指系统查询得到日志记录值(例如客户信息ProfileID)的实现过程,即实现从数据库中获取ETL包对应的日志记录值的的业务逻辑。
优选地,上述实施例中的查询模块可以包括:选择模块,用于选择ETL包中需要输出的日志事件,并选择日志事件包含的日志列;运行模块,用于在运行ETL包之后,获取日志输出表,其中,日志输出表包括用于填写执行编码值的日志列。
优选地,上述实施例中的创建模块可以包括:子创建模块,用于创建ETL对应的临时表,临时表包括日志记录值、执行编码值,以及日志记录值与执行编码值之间的对应关系。
具体的,上述通过运行ETL包后,通过通过ExecutionID和MessageText(含ProfileID的特殊日志记录值)的横向关联,可以高效获取到当前ETL包所对应的需要派生的日志记录值,具体的,可以通过表连接SQL获取。
优选地,上述实施例中的添加模块可以包括:建立模块,用于根据执行编码值建立日志输出表与临时表之间的关联关系;第二提取模块,用于从临时表中提取ETL包对应的日志记录值;增加模块,用于在从日志输出表中获取到具有相同执行编码值的日志行之后,根据日志输出表与临时表之间的关联关系,将日志记录值添加到具有相同执行编码值的日志行中。
本申请上述实施例中,根据日志记录值与执行编码值的关联关系,将日志记录值添加到日志输出表中具有相同执行编码值的日志行中的步骤可以包括如下步骤:根据执行编码值建立日志输出表与临时表之间的关联关系;从临时表中提取ETL包对应的日志记录值;在从日志输出表中获取到具有相同执行编码值的日志行之后,根据日志输出表与临时表之间的关联关系,将日志记录值添加到具有相同执行编码值的日志行中。
优选地,上述实施例中的ETL包运行的日志行中包括一消息文本列,将消息文本列的值设置为需要增加到日志中的日志记录。
从以上的描述中,可以看出,本发明实现了如下技术效果:解决了相关技术的由于无法自定义ETL包运行时输出的日志信息,导致用户无法高效应用或处理日志信息的问题,进而实现可以根据用户需求在输出的日志信息中派生新的日志列,从而达到扩展日志输出表的效果。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本申请可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。