运用开源软件Logstash和ElasticSearch实现DSpace日志实时统计分析
陈和
厦门大学图书馆 厦门 361005
通讯作者:陈和, ORCID: 0000-0002-4506-5612, E-mail:xmu_chen@xmu.edu.cn
摘要

【目的】设计并实现DSpace日志实时统计分析系统, 满足用户各种实时统计需求, 弥补DSpace自带统计功能的不足。【应用背景】受DSpace系统自身设计的限制, 其自带的日志统计功能单一, 表现形式僵化, 不能实现交互式统计分析。【方法】运用Logstash实时收集并分析DSpace日志, 运用ElasticSearch对分析后的日志进行索引, 构建QueryDSL查询调用ElasticSearch的Java API实现不同的统计功能, 并采用ECharts组件图形化展示结果。【结果】DSpace日志实时统计分析系统能够实现用户自定义时间区间统计条目、合集和社群的浏览排行, 条目对象下载排行以及访问地区排行等。统计的结果可以以不同图表形式展现。【结论】运用Logstash和ElasticSearch实现DSpace日志统计, 不需要修改DSpace源代码, 组件安装部署简单, 实现人机互动式查询统计, 统计结果快速且实时, 结果展现形式多样。

关键词: 日志分析; Dspace; Logstash; ElasticSearch; ECharts
中图分类号:G312
Using Logstash and ElasticSearch to Achieve Real-time Statistical Analysis of DSpace Logs
Chen He
Xiamen University Library, Xiamen 361005, China
Abstract

[Objective] The real-time statistical analysis system of DSpace logs is designed and implemented to meet the different needs of users, and to make up for lack of DSpace’s statistical functions itself.[Context] For the design limitations, the DSpace’s statistical functions are simple, rigid form of expression, and can not achieve interactive statistical analysis.[Methods] Use Logstash to collect and analyze DSpace logs, and use ElasticSearch to index the logs. Building QueryDSL to call ElasticSearch Java API to achieve different statistical functions, and show the graphical results with ECharts component.[Results] The real-time statistical analysis system of DSpace logs can get the browse rankings of items, collections and communities, get the download rankings of bitstreams, and get the regional rankings of website access, and so on. The statistics time can be customized by user, and the statistical result can be showed in different forms.[Conclusions] Using Logstash and ElasticSearch to achieve statistical analysis of DSpace logs has many excellences, just like no need to modify the code of DSpace, simple installation and deployment of the components, man-machine interactive query, fast and real-time, and rich forms to show the results.

Keyword: Log analysis; Dspace; Logstash; ElasticSearch; ECharts
1 引言

随着开放获取(Open Access)的不断发展, 构建机构知识库成为当下高校和其他科研机构热门的学术行为。有关机构知识库中的学术作品的存储量以及被使用情况的统计结果成为评价机构知识库的重要指标[1]

用于构建机构知识库的开源软件DSpace自带的统计功能非常丰富, 特别是1.6版本之后, 在系统首页、社群(Community)首页、合集(Collection)首页和条目(Item)首页都可以查看以表格形式呈现的当前系统、社群、合集和条目的总访问量、当前月和过去6个月的月总访问量、访问量最多的前10位国家和城市。在管理员管理项目中还可以查看整个系统的统计报表及分月统计报表[2]

然而, 即使DSpace自带的统计功能丰富, 在面对不同用户的不同统计需求时也有不足之处。比如, 用户需要统计某个特定时间段内某个合集或某条条目的浏览量时, 现有的统计功能就无法提供此数据。而且, DSpace的统计结果存在时滞(默认1天统计1次)。虽然, 1.8版本之后的DSpace增加了Discovery功能, 可以进行实时统计, 但是Discovery功能只是专注于不同分面(Facet)的统计与搜索[3]。因此, DSpace自带的统计功能存在统计方式不够灵活、缺少人机互动查询统计、统计结果存在时滞、结果展示方式单一等不足。这对要求很高且敏感的用户体验来说, 也是一种缺点。

针对DSpace自带统计功能的不足, 基于DSpace系统日志, 本文运用开源软件自主开发了一套DSpace日志实时统计分析系统, 旨在弥补其不足之处, 为用户在评价或宣传本机构知识库时提供统计参考, 并提高用户体验。

2 相关研究

针对DSpace系统的访问统计和内容统计功能上的不足, 中国科学院兰州文献情报中心的祝忠明团队对DSpace系统的统计功能模块进行了改造和扩展。针对访问利用统计功能, 在系统业务逻辑层扩展了日志分析处理模块, 在系统应用层的浏览和检索过程中嵌入统计模块, 实现了分别在条目级和仓储级按一定的时间选项范围、访问者的国别、域名等途径进行浏览和下载利用情况的统计、排行等, 统计结果以图表形式展现。针对内容统计功能, 在业务层定义和实现内容统计处理辅助类模块, 通过调用内容管理模块和用户管理模块的API, 实现机构、专题、职称、身份类型、时间段等单条件或多条件组合内容统计, 统计结果以表格或直方图形式展现。在后期, 他们还对访问统计部分完成进一步的改进, 通过对DSpace嵌入Solr客户端, 将系统的访问日志信息导入Solr服务器端的数据库, 利用Solr对海量数据的良好支持和快速查询响应性能, 实现了用户可以在客户端从各种角度进行实时访问统计[4, 5]

澳大利亚国立大学(The Australian National University)专门为DSpace开发了一个基于数据库的统计插件, 结合Cocoon技术可以提供图形化的报表。该统计插件主要包括三个组件: 日志处理(Log Processor)、数据模型(Data Model)和Web界面(Web Interface)。日志处理组件负责DSpace日志的收集、实时处理和存储; 数据模型负责有关参数和属性信息的存储; Web界面组件为与用户进行交互的接口, 具有可扩展性。统计插件的安装要与DSpace软件的安装设置相结合, 步骤比较多, 也比较繁琐[6, 7]

上述团队对DSpace有关统计功能的改进或扩展过程中, 有两个共同点: 统计数据都来源于DSpace的日志数据; 统计实现过程中, 都对DSpace源代码作了比较深入的研究和修改。修改DSpace源代码存在两个主要问题: 需要开发者对DSpace源代码深入研究并具有比较高的编程水平; 修改过源代码的DSpace在将来进行系统升级时会带来问题。

本文讨论的实时统计系统也是基于DSpace日志数据, 但不涉及修改DSpace源代码, 是独立于DSpace系统之外的实时统计系统。

3 系统设计思路与方案

DSpace运行时, 会把运行过程中的信息, 包括来访者请求信息(时间、IP地址、请求类型、检索词等)、系统处理请求并返回的信息(处理类名、资源ID号等)都记录下来并生成系统日志文件。因此, 只要对日志文件进行解析、存储、索引等处理, 就可以根据不同的需求统计相关结果, 并对结果进一步分析。

基于上述思路, 笔者提出如下设计方案:

(1) 甄别日志文件。对DSpace系统生成的各种日志文件进行梳理, 甄别有统计意义的日志文件作为统计系统数据来源。这个过程由人工阅读日志文件的方式实现。

(2) 转储并解析日志文件。对有统计意义的日志文件进行转储并解析, 获取有意义的字段信息。这个过程由开源软件Logstash[8]和Redis[9]实现。

(3) 索引文件。对提取出来的字段信息进行索引, 为进行查询统计做好准备。这个过程通过开源软件ElasticSearch[10]实现。

(4) 统计结果与展现。设计和开发一个Web网站, 由用户自定义统计条件, 构建QueryDSL[11]查询, 调用ElasticSearch的API, 结合可视化图表组件ECharts[12], 实时生成不同的统计报表。

整个系统的结构与流程如图1所示。系统设计的技术重点包括转储解析日志文件和结果统计展现。

图1 DSpace日志实时统计分析系统结构流程图

4 相关技术简介

(1) Logstash[8]

Logstash是一个遵循Apache 2.0许可的开源事件和日志管理工具。通过Logstash可以把不同系统上的日志和事件数据转移集中到一个地方, 同时可以对这些数据进行分析和存储, 用于搜索或其他用途。Logstash安装部署简便, 开包即用。目前, Logstash已经属于ElasticSearch家族的一个子成员, 两者常常组合应用, 协同工作。

本实时统计系统在DSpace所在服务器上部署Logstash, 将DSpace生成的日志实时转移到统计系统中。统计系统中的Logstash再对日志数据进行处理。

(2) ElasticSearch[10]

ElasticSearch(简称ES)是一个遵循Apache 2.0许可的灵活而且功能强大的基于Lucene构建的开源、分布式、实时搜索引擎。ES具有实时数据、实时分析、高可用性、支持QueryDSL查询框架等特性。Solr虽然也是基于Lucene构建的搜索引擎, 但是与ES相比, Solr的安装、部署与配置过程都比较复杂, 而且不支持QueryDSL查询框架。

本实时统计系统中, ES主要负责实时索引经过Logstash处理后的日志数据, 同时对外提供Java API, 随时做出响应。

(3) Redis[9]

Redis (Remote Dictionary Server)是一个由Salvatore Sanfilippo开发的Key-Value类型的内存数据库产品。Redis支持各种不同方式的排序, 为了保证效率, 数据都是缓存在内存中。

本实时统计系统中, Redis用于缓存从DSpace服务器端转移到统计服务器端的DSpace日志数据, 并保持日志原来序列。由于其数据缓存于内存, 具有很高的读写效率, 这是本统计系统实时性的体现之一。

(4) QueryDSL[11]

QueryDSL是一个通用的查询框架, 专注于通过Java API构建类型安全的SQL查询。借助QueryDSL可以在任何支持的ORM框架或者SQL平台上以一种通用的API方式构建查询。

由于ES支持QueryDSL查询, 所以本实时统计系统采用构建QueryDSL的方法, 调用ES的搜索Java API, 获得不同的统计结果。

(5) ECharts[12]

ECharts (Enterprise Charts) 是百度公司数据可视化团队开发的商业产品图表库。其底层基于ZRender (一个全新的轻量级Canvas类库), 创建了坐标系、图例、提示、工具箱等基础组件, 并在此上构建出形式多样的图表类型。

由于ECharts轻量、简单易用, 在本实时统计系统中被用来展示各种统计结果。

5 实时统计分析系统实现
5.1 甄别日志文件

DSpace系统运行时, 会产生两种类型的日志: 一种是由运行DSpace的容器(如Tomcat、Jetty、Caucho Resin)产生的系统日志; 另一种是由DSpace系统通过配置文件产生的日志(主要由Log4j生成), 包括checker.log、cocoon.log、dspace.log和solr.log。其中, dspace.log日志比较详细地记录了访问DSpace时的用户信息和行为信息, 具有统计分析意义。因此, 本实时统计系统选择dspace.log日志文件作为系统数据来源。

dspace.log日志文件中记录了5种类型的日志, 分别为DEBUG、INFO、WARN、ERROR和FATAL。以一条规范的INFO日志记录为例, 对记录内容进行分析说明, 如下所示:

2014-10-03 22:08:26, 033 INFO org.dspace.usage.LoggerUsage EventListener @anonymous:session_id=3C8D393F6DC90464B64354 1F557E3787:ip_addr=220.181.108.121:view_item:handle=2288/80040

日志记录以不同字符为分隔符, 区分不同部分内容的含义。以“ @” 为分隔符, 将日志记录分为前后两大部分, 分别为系统信息部分和用户及行为信息部分。系统信息部分以空格为分隔符, 分为4部分: 访问具体日期、访问具体时间、日志类型和系统对应处理的类名。用户及行为信息部分以“ :” 为分隔符, 分为5部分: 用户名(匿名用户显示为anonymous, 注册用户显示为注册邮箱名)、此次会话的ID、用户IP地址、用户行为和用户访问条目的handle。所以, 此条日志记录的含义是一个IP来自220. 181.108.121的匿名用户于2014-10-03 22:08:26, 033浏览了handle为2288/ 80040的条目, 系统的org.dspace. usage.LoggerUsage EventListener类处理了此次用户请求, 此次交互会话id为3C8D393F6DC90464B643541 F557E3787。其他类型的日志记录格式与此类似, 不再赘述。

5.2 转储并解析日志文件

由于实时统计系统独立于DSpace系统, 需要将DSpace系统产生的dspace.log日志文件数据实时转移传送到实时统计系统服务器端存储并作后续处理。

(1) 转储日志文件

日志文件的转储工作由部署在DSpace服务器上的Logstash代理和实时统计服务器上的Redis数据库完成。

①在DSpace服务器上安装部署Logstash。其过程很简单, 即从官网下载Logstash压缩包, 解压缩即完成部署。在启动Logstash之前, 需要配置一个Agent文件, 设置Logstash需要转储的文件及位置, 转储到何处。Agent的配置文件如下:

input{

file{

type => "dspace_log"

path => [ "/dspace/log/dspace.log.* " ]

//指定需要转储的文件名和路径。DSpace默认每天

生成一个dspace.log文件, 并以日期作后缀名, 在此用“ * ” 表示通配所有的dspace.log文件

}

}

output{

redis{

host => "172.18.0.74"

//Redis数据库所在地址, 即统计服务器所在地址

data_type => "list"

key => "logstash"

}

}

②在统计服务器上安装Redis数据库。安装Redis也非常简单, 而且不需要额外配置, 启动即可使用。

③在DSpace服务器端启动Logstash, 启动时需要指定之前配置的Agent文件。这样, DSpace服务器上的dspace.log日志记录将实时逐条传递到统计分析服务器的Redis数据库缓存起来。

(2) 解析日志文件

日志文件被转储到统计服务器后需要进行解析处理, 解析处理工作也是由Logstash完成。因此, 在统计服务器上也要部署Logstash, 部署过程如前所述, 即下载、解压。

同样地, 在启动Logstash进行日志解析时, 需要指定配置文件, 配置文件分为三个部分: Input、Filter和Output。其中Input和Output的内容与日志转储时的Agent配置文件相似, 告之Logstash需要解析的日志文件来自何处(Redis数据库), 解析后的数据送往何处(ES搜索引擎)。

解析配置文件的Filter部分是整个日志统计分析系统的关键之一, 其内容包括数据解析过滤、IP地址解析、日期格式化等, 分述如下。

①数据解析过滤

dspace.log日志数据并非都有统计意义或者暂时不需要进行统计, 因此需要将这些“ 没用” 的数据过滤掉。数据过滤规则是: 只要记录中后半部分即用户及行为信息中包含给定信息的, 将给予保留, 其余的全部被过滤掉。给定的信息包括: community_id、collection_id、bitstream_id、handle、query。

另外, 日志记录数据经过Logstash解析后, 如下字段: 版本号— version, 毫秒— Millisecond, 日志类型— loglevel, 处理类名— class, 会话ID— session_id。这些字段对统计分析暂时没有意义, 所以在过滤处理时也一并被过滤掉。

关键代码如下:

filter {

grok {

//指定过滤器

match => ["message", "%{TIMESTAMP_ISO8601:

visit_time}, %{NUMBER:Millisecond} %{LOGLEVEL:loglevel}
%{NOTSPACE:class}@ %{NOTSPACE:visitor}:session_id=%
{NOTSPACE:session_id}:ip_addr=%{IPV4:ip}:%{ NOTSPACE:action}:community_id=%{BASE10N UM:community_id}"]

//正则表达式保留指定给定信息— — community_id的日志(其他给定信息格式与此一致)

remove_field => ["@version", "Millisecond",

"loglevel", "class", "session_id"]

//删除不需要的字段信息

}

}

②IP地址解析

对于解析出来的用户IP地址, Logstash可以结合地理信息数据库GeoLite[13]进一步解析, 得到该IP的所在地区代码、城市名称、洲际代码、国家代码、国家名称、经纬度、时区等。对IP解析出来的丰富地理信息, 可以用来分析统计有关地理方面的信息。关键代码如下:

geoip{

source => "[ip]"

}

③日期格式化

经过Logstash解析出来的日期是字符型数据, 为使其具有日期统计分析意义, 需要将其转换为日期类型数据。关键代码如下:

date{

match => ["visit_time", "yyyy-MM-dd"] //指定日期格式

}

5.3 索引文件

dspace.log日志数据经过Logstash解析处理后, 需要对其索引处理, 以便供后续统计时调用。

需要在统计服务器上安装部署ES, 其过程相当简单, 从官网上下载ES压缩包, 解压缩即完成部署, 不需要配置直接启动即可正常使用。

由于在解析处理日志的Logstash的配置文件中的“ Output” 部分已经指定把处理后的数据推送到ES, 所以启动Logstash之后, ES会自动实时地进行索引并生成索引文件。同时, ES的搜索Java API也正常工作并随时供调用。如此过程, 体现了Logstash和ES之间协同工作的优越性。

5.4 统计结果与展现

为了使DSpace实时统计分析系统与最终用户进行交互, 需要设计一个简单的基于B/S模式JSP Web网站。用户可以在此网站上提交统计条件, 并查看统计结果。网站结构可以分为三个层次: 应用层、逻辑层和数据层, 如图2所示:

图2 DSpace日志实时统计分析系统Web结构

(1) 应用层: 预先在应用层设计不同的统计条件供用户选择。其中统计类型包括: 条目、合集、社群、数字对象、IP地址、城市名称、国家名称、访问者、查询词等, 统计的时间区间分为统计开始时间和统计结束时间。统计返回结果结合ECharts组件, 生成表格、柱状图、折线图等供用户查看和进一步分析。

(2) 逻辑层: 主要功能是接收应用层发来的各种统计条件, 转化和构建不同的QueryDSL, 并向数据层提出查询请求。

(3) 数据层: 其实就是ES, 包括索引文件和各种Java API。Java API响应逻辑层的QueryDSL请求, 并返回数据到应用层。

另外, 在应用层展现统计结果时, 如果统计的是条目、合集、社群或数字对象, 由于返回的是这些统计对象的ID号, 为使用户了解这些ID号代表的名称, 还需要通过ID号查询DSpace数据库, 并转换为更有实际意义的具体名称。

6 应用效果

设计好JSP Web网站后, 置于服务器的Tomcat容器中运行。启动Tomcat, 用户就可以访问网站, 进行各种统计查询, 并查看结果。假设某用户想统计“ 在2014年9月期间, DSpace中被浏览最多的5条条目是什么?浏览量分别是多少?” , 用户只需要在页面上的统计方式中选择“ 条目排名” , 统计开始时间选择“ 2014- 09-01” , 统计结束时间选择“ 2014-09-30” , 结果显示条数选择“ 5” , 提交查询后, 即可返回用户所需要的结果。返回的结果可以以表单形式展现(见图3), 也可以以图形展现(见图4)。

图3 表单形式展现查询结果

图4 柱状图形式展现查询结果

7 结语

采用开源软件Logstash和ElasticSearch, 并辅以Redis、ECharts等其他组件, 实现DSpace日志的实时统计分析, 具有不修改DSpace源代码, 系统安装部署简单, 编程代码量少, 而且统计分析结果实时、快速, 用户体验好等特点。实时统计的结果对机构知识库管理员评价机构知识库的运行、推广情况有良好的参考作用, 也可以在评价机构知识库中学术作品的传播效果时供参考。

本实时统计分析系统实现了DSpace系统自带统计功能无法实现的功能, 也实现了与DSpace系统自带统计功能相同或类似的功能, 两者可以互为补充。系统只是初步实现了简单统计, 为了能够实现更多和更丰富的统计分析功能, 下一步将从生成DSpace日志的Log4j配置文件入手, 增加和调整相关属性的设置, 使日志文件能够记录更多有统计分析意义的数据。另外, 需要进一步明晰统计结果, 比如需要过滤掉网络爬虫之类带来的“ 访问量” , 使结果更具真实性, 结果展示方式还待进一步优化。

参考文献
[1] 顾立平. 机构知识库评价机制 [EB/OL]. [2014-10-06]. http: //ir. las. ac. cn/hand le/12502/6368.
(Ku Liping. Evaluation for Institutional Repositories Development [EB/OL]. [2014-10-06]. http://ir.las.ac.cn/handle/12502/6368. [本文引用:1]
[2] DSpace Statistics [EB/OL]. [2014-10-06]. https://wiki.duraspace.org/display/DSDOC4x/DSpace+Statistics. [本文引用:1]
[3] DSpace Discovery [EB/OL]. [2014-10-06]. https://wiki.duraspace.org/display/DSDOC4x/Discovery. [本文引用:1]
[4] 祝忠明, 马建霞, 卢利农, . 机构知识库开源软件DSpace的扩展开发与应用[J]. 现代图书情报技术, 2009(7-8): 11-17.
(Zhu Zhongming, Ma Jianxia, Lu Linong, et al. Developing an Institutional Repository Platform via Extending DSpace[J]. New Technology of Library and Information Service, 2009(7-8): 11-17. ) [本文引用:1] [CJCR: 1.073]
[5] 姚晓娜, 祝忠明. 基于分面搜索引擎Solr的机构知识库访问统计[J]. 现代图书情报技术, 2011(7-8): 37-40.
(Yao Xiaona, Zhu Zhongming. Usage Statistics of Institutional Repository Based on Faceted Search Engine Solr[J]. New Technology of Library and Information Service, 2011(7-8): 37-40. ) [本文引用:1] [CJCR: 1.073]
[6] Development of Usage Statistics for RepositóriUM [EB/OL]. [2014-10-06]. https://repositorium.sdum.uminho.pt/handle/1822/4803. [本文引用:1]
[7] ANU DSpace Statistics Installation Guide [EB/OL]. [2014-1006]. http://sts.anu.edu.au/drs/downloads/dspace-stats/readme.html. [本文引用:1]
[8] Logstash [EB/OL]. [2014-10-06]. http://logstash.net/. [本文引用:2]
[9] Redis [EB/OL]. [2014-10-06]. http://redis.io/. [本文引用:2]
[10] ElasticSearch [EB/OL]. [2014-10-06]. http://www.elasticsearch.org/. [本文引用:2]
[11] QueryDSL [EB/OL]. [2014-10-06]. http://www.querydsl.com/. [本文引用:2]
[12] ECharts [EB/OL]. [2014-10-06]. http://echarts.baidu.com/. [本文引用:2]
[13] MaxMind [EB/OL]. [2014-10-06]. https://www.maxmind.com/. [本文引用:1]