一种日志采集方法、装置及设备与流程

文档序号:15557683发布日期:2018-09-29 01:30阅读:133来源:国知局

本说明书涉及计算机技术领域,尤其涉及一种日志采集方法、装置及设备。



背景技术:

在应用使用的过程中,经常需要收集应用的日志以备查询。

在当前,大规模的分布式系统使用广泛,对于专门用于采集应用日志的服务器而言,其一般会同时收集多个应用的日志。当前采集多个应用日志的方式一般为“先来先服务的日志采集调度策略”,或者,“多个独立线程轮询的调度策略”。

基于此,需要一种更便利的日志采集方案。



技术实现要素:

本说明书实施例提供一种日志采集方法、装置和设备,用于解决如下问题:以提供一种更便利的日志采集方案。

基于此,本说明书实施例提供一种日志采集方法,包括:

从预先建立的采集配置文件队列中依次调取目标日志采集配置文件,其中,所述目标日志采集配置文件中包含目标日志标识和待采集位置;

针对任一调取得到的目标日志采集配置文件,在指定的时间片之内,根据其所包含的目标日志标识和待采集位置执行日志采集操作。

同时,本说明书的实施例还提供一种日志采集装置,包括:

文件调取模块,从预先建立的采集配置文件队列中依次调取目标日志采集配置文件,其中,所述目标日志采集配置文件中包含目标日志标识和待采集位置;

采集执行模块,针对任一调取得到的目标日志采集配置文件,在指定的时间片之内,根据其所包含的目标日志标识和待采集位置执行日志采集操作。

对应的,本说明书实施例还提供一种日志采集设备,包括:

存储器,存储有日志采集程序;

处理器,调用所述存储器中的日志采集程序,并执行:

从预先建立的采集配置文件队列中依次调取目标日志采集配置文件,其中,所述目标日志采集配置文件中包含目标日志标识和待采集位置;

针对任一调取得到的目标日志采集配置文件,在指定的时间片之内,根据其所包含的目标日志标识和待采集位置执行日志采集操作。

对应的,本说明书的实施例还提供一种非易失性计算机存储介质,存储有计算机可执行指令,所述计算机可执行指令设置为:

从预先建立的采集配置文件队列中依次调取目标日志采集配置文件,其中,所述目标日志采集配置文件中包含目标日志标识和待采集位置;

针对任一调取得到的目标日志采集配置文件,在指定的时间片之内,根据其所包含的目标日志标识和待采集位置执行日志采集操作。

本说明书实施例采用的上述至少一个技术方案能够达到以下有益效果:

通过预先建立需要采集的目标日志的采集配置文件,并组成一个队列,而后,通过依次调取配置文件,在指定的时间片下,根据配置文件对目标日志进行采集,时间长度一到,立刻结束本次采集,并且在配置文件中更新待采集的位置。然后,调取下一个采集配置文件,继续在指定的时间片下执行采集。通过上述的基于时间片的调度方式,实现所有的配置文件都有被调度运行的机会,保证对所有的目标日志进行的公平采集,避免了某个目标日志长期霸占系统资源的现象,且无需额外的系统资源开销。

附图说明

图1为本说明书实施例所提供的日志采集方法的流程示意图;

图2为本说明书实施例所提供的采集配置文件队列和目标日志采集配置文件的示意图;

图3为本说明书实施例所提供的一种配置文件队列的调度处理示例图;

图4为本说明书实施例所提供的日志采集处理流程所涉及的架构示意图;

图5为本说明书实施例所提供的日志采集装置的结构示意图。

具体实施方式

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

在当前的应用使用过程中,一般都是基于大规模的分布式系统,其中会有大量机器每天需要收集上成千上万的日志数据,由于虚拟化技术的成熟,在一台机器上可能会同时收集多个应用的日志。当前进行日志采集时一般有如下两种方式:

1,先来先服务的日志采集调度策略。其提供一个队列,根据日志文件产生变化的顺序,依次将文件放入到调度队列中,按照文件进入队列的先后顺序进行调度和分配日志采集处理器进行执行。先进入队列的文件将独享处理器资源,这样在单线程的情况下,一旦一个文件战力了处理器资源,它就会一直运行下去,知道改文件处理完成为止,当某个文件快速不间断产生日志时,就会导致其他日志文件得不到采集处理产生被饿死的现象出现。

2,多个独立线程轮询的调度策略。其对于每个采集的日志文件目标,都创建一个单独的线程进行处理,在一个处理线程里,会定时的去轮询日志文件变动,进行日志文件的采集处理。如开源产品logstash、fluentd、nxlog等普遍采用多个独立线程做日志采集。当一个服务器需要采集的日志文件个数很多的时候,就会占用非常大的日志解析处理线程,对内核有较大的开销,且线程间上下文切换也会对程序的效率产生比较大的影响,而在日志稀疏产生的场景下,大部分线程是属于空闲状态的,资源的利用率低下。

基于此,本说明书提供一种日志采集方案,基于时间片调度的方法对目标日志进行读取采集,保证对所有的目标日志进行公平的采集,避免了某个目标日志长期霸占系统资源的现象,且无需额外的系统资源开销。

图1为本说明书实施例所提供的日志采集方法的流程示意图,具体包括以下步骤:

s101,从预先建立的采集配置文件队列中依次调取目标日志采集配置文件,其中,所述目标日志采集配置文件中包含目标日志标识和待采集位置。

如前所述,需要采集的目标日志通常而言具有多个,基于此,我们使用一个采集配置文件队列来控制对采集目标日志的执行操作,每个目标日志在队列中对应的具有一个目标日志采集配置文件,通过维护目标日志采集配置文件来实现对目标日志的公平采集,如图2所示,图2为本说明书实施例所提供的采集配置文件队列和目标日志采集配置文件的示意图。

该目标日志采集配置文件至少包括两个部分:目标日志标识和待采集位置。目标日志标识可以是具体的目标日志名称,例如,“xx_app.log”,也可以是一个具有对应关系的代号,例如“1”,通过一张对应关系表将“1”指向“xx_app.log”。待采集位置可以是目标日志中的一个具体的位置,例如,目标日志的第9行的第一个字母开始;也可以是一个位置偏移量,例如相对于目标日志的起始位置偏移量为“0x11”。

需要说明的是,在队列文件中,所有的目标日志采集配置文件所包含的目标日志标识是唯一的,不会存在两个相同的目标日志标识,从而可以一一对应的根据配置文件确定目标日志,或者根据目标日志标识确定日志采集配置文件,以执行相关的操作。此外,在对队列文件中的目标日志采集配置文件进行调取时,也可以不是依次进行的,只要能保证每个文件调取得到的概率相同,以实现对各个目标日志文件公平的采集读取即可,在这种原则下,依次调取的方式是最为简单的。

s103,针对任一调取得到的目标日志采集配置文件,在指定的时间片之内,根据其所包含的目标日志标识和待采集位置执行日志采集操作。

时间片即系统分配给每个进程允许执行的时间。在配置文件队列的基础上,将日志采集处理时间进行指定(如每个时间片设置为100毫秒,即,允许对每个目标日志配置文件执行的时间为100毫秒),系统依次遍历配置文件队列里的各个元素,对相应的目标日志执行采集处理。对于文件队列中的每个配置文件所对应的目标日志,每次采集处理最多占用系统一个时间片。如果目标日志在一个时间片内提前完成采集处理则立刻主动释放资源,否则在一个时间片后剥夺该配置文件对系统资源的使用权,并调度下一个就绪的目标日志采集配置文件开始执行采集。在上述的采集过程中,对于目标日志的采集位置,由配置文件中的待采集位置给定。所述的采集操作一般而言即为对外部的目标日志文件进行读取,以得到其具体的内容。对于初始的待采集位置,可以在建立配置文件的时候根据实际需要进行适当的赋值即可,例如,希望对于目标日志从最初开始采集,设置待采集位置(相对于目标日志起始位置的偏移量)为“0”。

上述方案中,通过预先建立需要采集的目标日志的采集配置文件,并组成一个队列,而后,通过依次调取配置文件,在指定的时间片下,根据配置文件对目标日志进行采集,时间长度一到,立刻结束本次采集,并且在配置文件中更新待采集的位置。然后,调取下一个采集配置文件,继续在指定的时间片下执行采集。通过上述的基于时间片的调度方式,实现所有的配置文件都有被调度运行的机会,保证对所有的目标日志进行的公平采集,避免了某个目标日志长期霸占系统资源的现象,且无需额外的系统资源开销。

作为一种具体的实施方式,对于s103中的,在指定的时间片之内,根据其所包含的目标日志标识和待采集位置执行日志采集操作,可以采用如下方式:在指定的时间片之内,从所述待采集位置开始,对所述目标日志(即目标日志标识所对应的日志)执行采集操作;确定在本次时间片结束时,本次采集操作的采集中断位置;根据所述采集中断位置更新所述目标日志采集配置文件中的待采集位置,以便一下次调取时对目标日志从采集中断位置继续采集。

具体而言,在一个时间片之内,对目标日志进行读取,对于较小的目标日志可能可以完全读取,而对于一些变动较大或者持续产生日志变动的目标日志而言,则一般只能读取一部分。当时间片长度一到时,即结束了本次读取,采集中断。当下一次调度到该目标日志的配置文件时,需要能继续从本次中断读取的地方进行再次读取,从而需要对中断的读取位置进行保存,即根据中断位置更新待读取的位置。一般而言,即为将中断位置的地址或者偏移量直接赋值给待读取位置。例如,对于目标日志,在本次读取中,一直读到相对于起始位置偏移量为“0x01”,即将该值赋予待读取位置,从而下次调度时,根据待读取位置的值计算偏移量,确定读取位置。通过根据中断位置确定待读取位置的值,可以保证对同一目标文件的读取是连续有效的,且不会重复读取。

此外,作为一种具体的实施方式,对于目标日志采集配置文件还可以包括:处理状态标识。处理状态标识可以具有两个对应的用于表征目标日志采集状态的值:表征待处理的值和表征已处理的值。例如,用“0”表征对目标日志的采集已经完成,已处理完毕;用“1”表征目标日志发生了变动,需要采集,或者,本次采集还没有采集完全,需要继续采集,表征待处理。容易理解,此处的表征值也可以是其他的表现形式。只需是系统可以识别的两个相对应的值即可,例如,其还可以是诸如“t”或者“f”、“y”或者“n”之类的相对应的值等等。

从而可以根据处理状态标识的表征值进行预先判断。若目标日志采集配置文件中处理状态标识的表征值为“0”时,即可以快速的略过该文件,不对其目标日志执行操作,或者,删除该目标日志采集配置文件,以加快对其它目标日志的调度。当目标日志采集配置文件中处理状态标识的表征值为“1”时,才继续根据待处理位置对目标日志执行采集操作。通过给在配置文件中给目标日志设定表征值,可以快速的忽略或者删除掉那些已经完成处理或者无需处理的日志文件的配置文件,从而达到在依次调度时可以更加有效的节省系统资源,提高读取效率。

在实际应用中,对于上述方案中处理状态标识的表征值,可以采用如下方式预先设定得到:接收携带目标日志标识的目标日志文件变更消息;查询所述采集配置文件队列中是否存在包含相同目标日志标识的目标日志采集配置文件,若存在,将所述包含相同目标日志标识的目标日志采集配置文件中的处理状态标识的表征值设为表征待处理的值;若不存在,创建一个包含所述目标日志标识的目标日志采集配置文件至所述配置文件队列中,在所述创建的目标日志采集配置文件中,处理状态标识的表征值设为表征待处理的值。

具体而言,所述的目标日志文件变更消息只需通知哪个目标日志发生了变动,而无需告知具体变动的内容。以上述示例中,用“0”表征已处理和用“1”表征待处理为例,当系统接收到变更消息时,会先判断目标日志标识在配置文件队列中是否存在:如不存在则新建目标日志采集配置文件至文件队列中,并设置状态处理标识为“1”;如已存在,设置该目标日志采集配置文件的状态处理标识为“1”。

此外,对于上述方案中处理状态标识的表征值,还可以采用如下方式生成得到:确定在指定的时间片之内,对目标日志的全部是否采集完成;若是,将所述处理状态标识的表征值设为表征已处理的值;若否,将所述处理状态标识的表征值设为表征待处理的值。

即,在本次时间片之内,若当前目标日志处理结束(即对当前日志的全部都已经采集完毕),则修改引用计数为“0”,否则保持计数为“1”,同时记录下当前处理位置,等待下一次调度到来时继续处理。如图3所示,图3为本说明书实施例所提供的一种配置文件队列的调度处理示例图,在该示例中,系统对于目标日志“3.log”在一个时间片内,进行了调度并完成了读取,将其处理状态标识的表征值从“1”修改为“0”,并继续调度下一个目标日志采集配置文件以对目标日志“4.log”进行读取。在下一次读取到目标日志“3.log”的采集配置文件时,则可根据其状态表征值“0”,对3号目标日志的配置文件进行忽略或者删除。

在对日志进行采集之后,由于本说明书实施例所提供的方案中都是根据时间片进行间断性的采集,因此,还可以根据配置文件中的目标日志标识对采集得到的目标日志信息(即具体的变更内容)进行进一步的分类和归档,以及根据归档内容开展监控或者报表展示等等后续业务。如图4所示,图4为本说明书实施例所提供的日志采集处理流程所涉及的架构示意图。

基于同样的思路,本发明还提供一种日志采集装置,如图5所示,图5为本说明书实施例所提供的日志采集装置的结构示意图,包括:

文件调取模块501,从预先建立的采集配置文件队列中依次调取目标日志采集配置文件,其中,所述目标日志采集配置文件中包含目标日志标识和待采集位置;

采集执行模块503,针对任一调取得到的目标日志采集配置文件,在指定的时间片之内,根据其所包含的目标日志标识和待采集位置执行日志采集操作。

进一步地,所述采集执行模块503,在指定的时间片之内,从所述待采集位置开始,对所述目标日志执行采集操作;确定在本次时间片结束时,本次采集操作的采集中断位置;根据所述采集中断位置更新所述目标日志采集配置文件中的待采集位置,以便一下次调取时对目标日志从采集中断位置继续采集。

进一步地,所述目标日志采集配置文件还包括:处理状态标识;所述装置还包括确定模块505,根据所述处理状态标识的表征已处理的值,确定对目标日志采集配置文件执行删除操作;或者,根据所述处理状态标识的表征待处理的值,确定对目标日志执行日志采集操作。

进一步地,所述装置还包括第一赋值模块507,接收携带目标日志标识的目标日志文件变更消息;查询所述采集配置文件队列中是否存在包含相同目标日志标识的目标日志采集配置文件;若存在,将所述包含相同目标日志标识的目标日志采集配置文件中的处理状态标识的表征值设为表征待处理的值;若不存在,创建一个包含所述目标日志标识的目标日志采集配置文件至所述配置文件队列中,在所述创建的目标日志采集配置文件中,处理状态标识的表征值设为表征待处理的值。

进一步地,所述装置还包括第二赋值模块509,确定在指定的时间片之内,对目标日志的全部是否采集完成;若是,将所述处理状态标识的表征值设为表征已处理的值;若否,将所述处理状态标识的表征值设为表征待处理的值。

进一步地,所述装置还包括分类和归档模块511,根据目标日志标识对采集得到的目标日志信息进行分类和归档。

对应的,本申请实施例还提供一种日志采集设备,包括:

存储器,存储有日志采集程序;

处理器,调用所述存储器中的日志采集程序,并执行:

从预先建立的采集配置文件队列中依次调取目标日志采集配置文件,其中,所述目标日志采集配置文件中包含目标日志标识和待采集位置;

针对任一调取得到的目标日志采集配置文件,在指定的时间片之内,根据其所包含的目标日志标识和待采集位置执行日志采集操作。

基于同样的发明思路,本申请实施例还提供了对应的一种非易失性计算机存储介质,存储有计算机可执行指令,所述计算机可执行指令设置为:

从预先建立的采集配置文件队列中依次调取目标日志采集配置文件,其中,所述目标日志采集配置文件中包含目标日志标识和待采集位置;

针对任一调取得到的目标日志采集配置文件,在指定的时间片之内,根据其所包含的目标日志标识和待采集位置执行日志采集操作。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备和介质类实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可,这里就不再一一赘述。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤或模块可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(programmablelogicdevice,pld)(例如现场可编程门阵列(fieldprogrammablegatearray,fpga))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片pld上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logiccompiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(hardwaredescriptionlanguage,hdl),而hdl也并非仅有一种,而是有许多种,如abel(advancedbooleanexpressionlanguage)、ahdl(alterahardwaredescriptionlanguage)、confluence、cupl(cornelluniversityprogramminglanguage)、hdcal、jhdl(javahardwaredescriptionlanguage)、lava、lola、myhdl、palasm、rhdl(rubyhardwaredescriptionlanguage)等,目前最普遍使用的是vhdl(very-high-speedintegratedcircuithardwaredescriptionlanguage)与verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。

控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(applicationspecificintegratedcircuit,asic)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc625d、atmelat91sam、microchippic18f26k20以及siliconelabsc8051f320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。

上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。

为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书的实施例时可以把各单元的功能在同一个或多个软件和/或硬件中实现。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信编号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。

本领域技术人员应明白,本说明书中一个或多个的实施例可提供为方法、系统或计算机程序产品。因此,本说明书的实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的形式。而且,本说明书的实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本说明书的实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定事务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书的实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行事务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。

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