发明内容
本发明为克服上述问题或者至少部分地解决上述技术问题,提供一种日志信息格式化方法及系统。
根据本发明的一个方面,提供一种日志信息格式化方法,包括:
步骤1,当待处理日志文件为List集合时,获取所述List集合所包含各元素的数据类型;
步骤2,基于所述List集合所包含各元素的数据类型,将所述List集合日志文件中各元素转换为字符串类型,并依次保存到同一字符串文件中。
进一步,所述获得所述List集合所包含各元素的数据类型的步骤前还包括:
对所述List集合中的各字符串进行截取,获得所述各元素。
进一步,所述步骤1中获得所述List集合所包含各元素的数据类型的步骤进一步包括:
当所述List集合内待获取数据类型的任一元素为List集合时,依次获取所述任一元素所包含各元素的数据类型。
进一步,所述基于所述元素的描述信息,获取该元素的数据类型的步骤进一步包括:
获取所述元素字符串中的特征字符,根据所述特征字符所对应的数据类型,获得该元素的数据类型。
进一步,所述对所述List集合中的各字符串进行截取的步骤进一步包括:通过依次定位所述List集合中各字符串起始字符与结束字符,对所述List集合中各字符串进行截取。
进一步,所述获取所述元素字符串中的特征字符的步骤进一步包括:在所述元素字符串的预设位置获取相应的特征字符。
进一步,所述步骤1中,通过判断所述待处理日志文件内所含变量为数组,从而判断所述待处理日志文件为List集合。
进一步,还包括:
步骤1’,当待处理日志文件为JSON格式时,当所述JSON格式日志文件中字符串以"{"开头,则获取该字符串中所包含的元素,并通过4字节缩进的方式获取所述JSON格式日志文件中所包含的所有元素。
根据本发明的一个方面,提供一种日志信息格式化系统,包括:
获取模块,用于当待处理日志文件为List集合时,获取所述List集合所包含各元素的数据类型;
格式化模块,用于基于所述List集合所包含各元素的数据类型,将所述List集合日志文件中各元素转换为字符串类型,并依次保存到同一字符串文件中。
本申请提出一种日志信息格式化方法及系统,所述方法先获取传统List集合格式日志文件中各元素的数据类型,基于各元素的数据类型,将所述List集合格式日志文件中各元素转化为字符串类型,并依次保存到同一字符串文件中。本发明具有如下有益效果:1、保证了过长字符的List集合格式日志文件内容输出时的完整性;2、能够直接获取所述List集合格式日志文件中各元素所包含的具体信息。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
本方案对日志的格式化是日志组件内部自动实现的,对于使用该组件的人来说内部的格式化方法是透明的,也就是不可见的。只需要简单的函数调用就能够将日志文件进行完整的格式化输出。
如图1,示出本发明一个具体实施例中一种日志信息格式化方法整体流程示意图。总体上,包括以下步骤:
步骤1,当待处理日志文件为List集合时,获得所述List集合所包含各元素的数据类型;
步骤2,基于所述List集合所包含各元素的数据类型,将所述List集合日志文件中各元素转换为字符串类型,并依次保存到同一字符串文件中。
在本发明另一个具体实施例中,一种日志信息格式化方法,所述获得所述List集合所包含各元素的数据类型的步骤前还包括:
对所述List集合中的各字符串进行截取,获得所述各元素。
在编程语言中List是标准类库中的一个类,可以简单视之为双向链表,以线性列的方式管理物件集合。List的特色是在集合的任何位置增加或删除元素都很快,但是不支持随机存取。List是类库提供的众多容器(container)之一,除此之外还有vector、set、map、…等等。List以模板方式实现(即泛型),可以处理任意型别的变量,包括使用者自定义的资料型态例如:它可以是一个放置整数(int)型态的List、也可以是放置字串(char或string)型态的List、或者放置使用者自定类别(user-defined class)的List。
在本发明另一个具体实施例中,一种日志信息格式化方法,所述步骤1中获得所述List集合所包含各元素的数据类型的步骤进一步包括:
当所述List集合内待获取数据类型的任一元素为List集合时,依次获取所述任一元素所包含各元素的数据类型。
在上述本发明具体实施例中,List集合中所包含的元素可能为另一个List,同理,这个被包含的List中同样也包含有List和各种元素。所以,当对母List进行处理的过程中,如果遇到子List,那么对该子List执行与母List相同的处理操作,循环往复,直至日志文件中所包含的所有包含日志信息的元素信息的数据类型被获取。
在本发明另一个具体实施例中,一种日志信息格式化方法,所述元素的数据类型通过以下步骤获取:基于所述元素的描述信息,获取该元素的数据类型。
在本发明实施例中,当List集合内待获取数据类型的元素不是List集合,而是直接包含具体日志信息的元素时,那么通过获取该元素的描述信息,基于所述元素的描述信息,获得该元素的数据类型。
在本发明另一个具体实施例中,一种日志信息格式化方法,所述基于所述元素的描述信息,获取该元素的数据类型的步骤进一步包括:
获取所述元素字符串中的特征字符,根据所述特征字符所对应的数据类型,获得该元素的数据类型。
在本发明具体实施例中,先期在所述元素的描述信息的特定位置设置一个特征字符,所述各特征字符对应一种数据类型,各种元素所可能数据类型互不相同;当需要判断元素的数据类型时,通过获取所述元素的描述信息中的标记信息,根据所述标记信息找到其所对应的数据类型,从而获得该元素的数据类型。
在本发明另一个具体实施例中,一种日志信息格式化方法,所述对所述List集合中的各字符串进行截取的步骤进一步包括:通过依次定位所述List集合中各字符串起始字符与结束字符,对所述List集合中各字符串进行截取。
本发明具体实施例中上述字符串的截取步骤可以利用但不限于substring()函数进行实现,能够实现如下功能:返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。
在本发明另一个具体实施例中,一种日志信息格式化方法,所述获取所述元素字符串中的特征字符的步骤进一步包括:在所述元素字符串的预设位置获取相应的特征字符。
在本发明另一个具体实施例中,一种日志信息格式化方法,所述步骤1中,通过判断所述待处理日志文件内所含变量为数组,从而判断所述待处理日志文件为List集合。
本发明具体实施例中上述日志内所包含变量的判断能够但不限于isArray()函数,以用于返回值指明某变量是否为数组。
在本发明另一个具体实施例中,一种日志信息格式化方法,还包括:
步骤1’,当待处理日志文件为JSON格式时,当所述JSON格式日志文件中字符串以"{"开头,则获取该字符串中所包含的元素,并通过4字节缩进的方式获取所述JSON格式日志文件中所包含的所有元素。
在本发明上述具体实施例中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
在本发明另一个具体实施例中,一种日志信息格式化方法,包括:
对于List集合的格式化首先对比一下格式化输出和非格式化输出的差异性。
非格式化输出:
Lcom.tool.log.example.model.man;@a06e507;
格式化后的输出:
通过对比发现非格式化的集合数据进行输出的时候是无法将集合类的内容进行输出的。如果需要输出集合中的具体信息还需要解析结合类的数据然后一条一条的打印出来,这样非常麻烦且浪费时间。
对比观察发现格式化后的数据是能够正常输出相关数据的,并且数据格式清晰,日志内容信息一目了然,极大的提高了调试代码的效率。接下来描述一下是如何将集合List中的数据进行格式化输出的方法。
下面就本发明具体实施例一种日志信息格式化方法的具体步骤进行说明:
List里面的数据是可以是多种类型的,为了将List中的数据进行格式的输出,首先得要判断List内的数据类型,判断List内的数据类型的方法是通过自定义函数StringgetType(List List)来进行实现的。
自定义函数String getType(List List)中将集合List传递到getType函数中,getTpye函数通过判定后将判定结果以String的形式进行返回。然后通过for循环的形式for(int i=0;i<List.size();i++)来遍历List中的所有数据,然后对每一个元素调用getType函数来确定该元素的数据类型。
对于集合中的元素调用toString()方法的时候该函数会返回元素的描述信息,元素的描述信息有如下特性,如果是整数[int]则会以“[I”开头,如果是double类型的则会以“[D”开头,如果是boolean类型的则会以“Z”开头,如果是byte类型的则会以“[B”开头,如果是short类型的则会以“[S”开头,如果是long类型的则会以“[J”开头,如果是float类型的则会以“[F”开头,如果是List类型的则会以“[L”开头。
getType的实现逻辑如下:
首先通过isArray(object)函数来判断该元素是不是一个List,如果是一个List需要对这个List进行递归调用,也就是对这个List需要进行上述类似的处理逻辑流程。如果该元素不是一个List那么就可以通过解析其toString方法的开头字母来判定该元素是属于什么类型的元素。
解析元素中的toString方法是通过调用substring字符串截取函数来对字符串进行截取操作的。具体是通过substring(str.IndexOf("[")+1,str.IndexOf("[")+2).charAt(0)方法来截取首个字符串的。Substring函数总共有2个参数,第一个是起始位置,第二个是截止位置,本方案中的其实位置是通过调用str.IndexOf("[")+1方法来获取的,其中str.IndexOf("[")会返回“[”符号出现的索引位置,索引位置+1就是“[”符号出现的位置信息。str.IndexOf("[")+2使结束的位置信息,最后通过调用charAt(0)来获取该截取后的第一个字符串,这样就能够获取到元素中的类型信息了。
对于List集合遍历循环过程中每次判定完成一个元素的类型后需要将该元素转换成String类型的数据进行输出。具体的转换逻辑是
如果是”I”,那么表明该数据类型是int类型,就通过result.append(Arrays.toString((int[])array));将数据存储到result字符串中。
如果是”D”,那么表明该数据类型是double类型,就通过result.append(Arrays.toString((double[])array));将数据存储到result字符串中。
如果是”Z”,那么表明该数据类型是boolean类型,就通过result.append(Arrays.toString((boolean[])array));将数据存储到result字符串中。
如果是”B”,那么表明该数据类型是byte类型,就通过result.append(Arrays.toString((byte[])array));将数据存储到result字符串中。
如果是”S”,那么表明该数据类型是short类型,就通过result.append(Arrays.toString((short[])array));将数据存储到result字符串中。
如果是”F”,那么表明该数据类型是float类型,就通过result.append(Arrays.toString((float[])array));将数据存储到result字符串中。
通过上述的类型的判定和结果append(添加)的方式最终List集合中的所有数据全部都被保存到result这个变量中了。然后将result的相关内容进行输出即可。
本具体实施例通过List元素中的标示符来智能判定元素的数据类型,根据不同元素的数据类然后调用不同的append函数将解析好的数据添加到result变量中,使用代码实现全自动的List数据格式化并封装的过程,这样就提高了输出日志的阅读性。同时也降低了开发者去自己打印日志数据自己格式化的过程,使用起来更加简洁方便。
在本发明另一个具体实施例中,一种日志信息格式化方法,包括:
对于JSON首先来对比一下格式化输出和非格式化输出的形式非格式化:
D/test:{‘flag’:true,’user’:{‘id’:32767,’name’:{‘id’:32768}}}
格式化输出:
可以很明显的看到格式化输出的效果对比没有格式化输出的效果更容易让人理解。大大提高了日志的阅读性。可以很大程度上提升程序的开发效率。
接下来分析一下JSON格式化输出的过程。
首先通过if(JSONStr.startsWith("{"))来判断JSONStr是不是以“{”开头的,如果是以"{"开头的表示是JSON中的元素的开始位置,此时就获取该元素并对该元素实现4个字节的缩进。
具体是通过JSONObject JSONObject=new JSONObject(JSONStr);来件JSONStr转换成一个JSONObject对象,JSONObject是对JSON的一种抽象描述。然后对该JSONObject元素调用JSON=JSONObject.toString(4);来实现4字节缩进。
通过上述逻辑的不断递归这样就能够将原始字符串进行格式化城上述所示的字符串的展现形式了。然后对最终格式化完成的数据进行输出就能够得到所示的形式来展示数据。
JSON数据格式的展现形式变得更加容易阅读,提高了程序的调试速度可开发效率。同时为数据化格式化后变得更加美观清晰,能够很快定位键值对的相关信息内容。
如图2,示出本发明另一个具体实施例中,一种日志信息格式化系统,包括:
获取模块A1,用于当待处理日志文件为List集合时,获取所述List集合所包含各元素的数据类型;
格式化模块A2,用于基于所述List集合所包含各元素的数据类型,将所述List集合日志文件中各元素转换为字符串类型,并依次保存到同一字符串文件中。
在本发明另一个具体实施例中,一种日志信息格式化系统,所述获取模块还用于:对所述List集合中的各字符串进行截取,获得所述各元素。
在本发明另一个具体实施例中,一种日志信息格式化系统,所述获取模块还用于:当所述List集合内待获取数据类型的任一元素为List集合时,依次获取所述任一元素所包含各元素的数据类型。
在本发明另一个具体实施例中,一种日志信息格式化系统,所述获取模块还用于:基于所述元素的描述信息,获取该元素的数据类型。
在本发明另一个具体实施例中,一种日志信息格式化系统,所述获取模块还用于:获取所述元素字符串中的特征字符,根据所述特征字符所对应的数据类型,获得该元素的数据类型。
在本发明另一个具体实施例中,一种日志信息格式化系统,所述获取模块还用于:通过依次定位所述List集合中各字符串起始字符与结束字符,对所述List集合中各字符串进行截取。
在本发明另一个具体实施例中,一种日志信息格式化系统,所述获取模块还用于:在所述元素字符串的预设位置获取相应的特征字符。
在本发明另一个具体实施例中,一种日志信息格式化系统,所述获取模块还用于:通过判断所述待处理日志文件内所含变量为数组,从而判断所述待处理日志文件为List集合。
在本发明另一个具体实施例中,一种日志信息格式化系统,还包括:JSON格式化模块,用于:当待处理日志文件为JSON格式时,当所述JSON格式日志文件中字符串以"{"开头,则获取该字符串中所包含的元素,并通过4字节缩进的方式获取所述JSON格式日志文件中所包含的所有元素。
图3示出本申请实施例的日志信息格式化方法的设备的结构框图。
参照图3,所述日志信息格式化方法的设备,包括:处理器(processor)301、存储器(memory)302、通信接口(Communications Interface)303和总线304;
其中,
所述处理器301、存储器302、通信接口303通过所述总线304完成相互间的通信;
所述通信接口303用于该设备与日志信息格式化方法的通信设备之间的信息传输;
所述处理器301用于调用所述存储器302中的程序指令,以执行上述各方法实施例所提供的方法,例如包括:当待处理日志文件为List集合时,获得所述List集合所包含各元素的数据类型;基于所述List集合所包含各元素的数据类型,将所述List集合日志文件中各元素转换为字符串类型,并依次保存到同一字符串文件中。
本实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:当待处理日志文件为List集合时,获得所述List集合所包含各元素的数据类型;基于所述List集合所包含各元素的数据类型,将所述List集合日志文件中各元素转换为字符串类型,并依次保存到同一字符串文件中。
本实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:当待处理日志文件为List集合时,获得所述List集合所包含各元素的数据类型;基于所述List集合所包含各元素的数据类型,将所述List集合日志文件中各元素转换为字符串类型,并依次保存到同一字符串文件中。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的直播重连方法的测试设备等实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后,本申请的系统仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。