基于python数据分析工具分析ezproxy SPU日志外文翻译资料

 2021-11-14 22:17:04

英语原文共 23 页

基于python数据分析工具分析ezproxy SPU日志

Brighid M. Gonzales

摘要:即使有各种免费和现成的分析ezproxy日志文件的工具,也很难从中获得有用的、有意义的数据。使用Python编程语言及其专门为数据分析创建的模块集合可以帮助完成此任务,并最终生成更好、更有用的数据,这些数据是根据使用它的库的需要定制的。本文描述了Lake大学的Lady如何使用python分析其ezproxy日志文件以获取更有意义的数据,包括完成此任务所需的代码演练。

关键词: 数据分析;python;ezproxy;

1 引言

OCLC的ezproxy是一种认证软件,允许库对远程用户进行认证,以访问库的订阅资源。除了认证用户之外,ezproxy还允许在其配置中设立大量的定制化功能,包括在服务器上收集的日志文件类型以及在这些日志中收集的信息。虽然其中一些日志(如审核日志和消息日志)对于排除用户访问、监视使用限制和调试数据库访问等问题很有作用,但其他日志收集库可以通过分析的特定详细数据信息,得出“关于用户的资源是如何被利用”的有用数据及趋势。尤其是,ezproxy的默认每月日志和非默认SPU(起始点URL)日志收集了大量有关资源使用的信息。即使有各种为此目的而存在的免费和现成的工具,分解及分析这些数据依然可能会很困难。在某些情况下,使用python及其特定于数据分析的模块集合最终可以为库提供更好、更有用的数据。

2 收集数据

ezproxy的默认每月日志是由配置文件中的此行命令自动生成的:

1

LogFormat %h %l %u %t “%r” %s %b

此指令收集的数据包括用户的IP地址(%h)、用户的用户名(如果可用)(%l)、会话ID(%u)、时间和日期戳(%t)、HTTP请求(“%r”)、请求的状态(%s)和传输的字节(%b)。

ezproxy的SPU日志之所以如此命名,是因为它们收集有关“起始点URL”的信息,[1]一段URL附加到ezproxy登录的受保护资源的URL,保证用户在访问该资源之前必须登录。此外,管理员还可以在指令中添加各种其他字段,去配置ezproxy以记录其他信息。因为它收集用户起点和其他可配置数据的信息,所以Lady决定使用Sueltenfuss库在ezproxy配置中使用SPU日志并使用这些日志进行数据分析。

sueltenfuss库配置的logspu命令包含以下指令:

1

2

LogSPU -strftime SPUlogs/spu%y%m%d.log %h %t %u

%{ezproxy-session}i %U %b %{ezproxy-spuaccess}i %{referer}i

根据这个指令,ezproxy服务器为每月的每一天创建一个spu日志文件,并将其保存在名为spulogs的服务器上的一个文件夹中。此指令收集的数据包括用户的IP地址(%h)、时间和日期戳(%t)、用户的用户名(如果可用)(%u)、会话ID(%ezproxy会话i)、请求的URL(%u)、传输的字节(%b)、用户在校园内还是校外(%ezproxy spuaccess i)以及将用户引用到ezproxy登录的URL。通过将其他字段[2]添加到ezproxy配置文件中的指令,可以收集许多其他数据。

3 分解数据

虽然OCLC的网站说它不支持任何一个日志文件分析程序,但它列出了六个可用于分析ezproxy日志文件的不同程序:awstats、ezpaarse、faststats analyzer、sawmill、webalizer和xpolog[3]。

Sueltenfuss库以前曾尝试使用ezpaarse,但没有成功,在实现python脚本之前,使用了另一个不在列表中的免费程序Analog[4]来分析ezproxy日志文件。在ezproxy spu日志文件上运行Analog会生成一个HTML文件,然后该文件可以保存为PDF格式,用于共享和保存每月数据。虽然我们可以从输出报告中收集到的一些很有用的信息,例如一周中每天的请求数和一天中每小时的请求数,这让我们很好地了解了服务器最常用的日期和时间,但是其他信息(如引用者和请求报告)却不那么有用。由于捕获的许多URL都是动态构造的,其中包括会话信息和搜索查询信息等,因此它们通常有几行长,程序很难以提供合适方式对它们进行解析来得到有意义的信息。在日志中收集并通过模拟分析的大部分数据最终对我们毫无用处。

图1.显示参考URL的模拟报告图表

库决定我们可以通过编写脚本自己解析文件来从日志文件中获得更好、更有用的信息。我们决定使用python,这是一种经常用于分析大型数据集的脚本语言,python库用于分析数据,matplotlib用于可视化数据。

第一步是确定要分析的日志文件中的信息。IP地址虽然在故障排除之外本身并没有那么有用,但最终可以用来为用户获取一个大致的地理位置。除了知道用户的位置之外,时间和日期戳还可以向我们提供有关他们使用ezproxy的一周中的哪一天、每月的哪一天和一天中的哪一小时的信息。与IP地址一样,用户名在排除故障之外并非天生有用,但是,用户名可以用来查找用户在校园中的状态(无论他们是普通在校学生、远程研究生、博士生、教师等),这最终将是有用的信息。会话ID和传输的字节数对我们都不是特别有用,所以我们选择忽略文件中的数据。下一条信息是用户是从校内还是校外访问ezproxy,这也是我们想要分析的信息。这就留下了引用URL和请求的URL,这将为我们提供更多信息,说明我们的用户请求访问哪些资源,以及他们请求访问时所在的站点。

在确定需要保留日志中的哪些信息之后,下一步是逐行分析每个日志,以便我们需要的每个数据都可以单独保存。为此,一个月的ezproxy spu日志文件被复制并保存到一个名为“ezproxy_log s”的文件夹中。在python中,我们首先必须导入“glob”和“os”,这样我们才能访问“ezproxy_log s”文件夹中的所有文件。然后我们一行一行地浏览文件夹中的每个文件,并将每一行分割成一个索引列表,以便分别访问每个数据变量。以下代码完成了此操作:

图2.一行一行地遍历每个日志文件的python代码

在第一个日志文件的这一行中,上面的代码将该行拆分为一个列表,然后通过其索引号访问每个元素:

图3.一行从一个日志文件分割成一个python列表

在这种情况下,日志[0](列表的第一个索引)表示IP地址。时间和日期戳已被拆分,因为时间和日期戳与时区指示器之间存在空格。所以日志[1]和日志[2]一起表示完整的时间和日期。用户名(日志[3])和会话ID(日志[4])都是破折号,这意味着该用户在校园中,并在不需要登录的情况下传递给资源。这由日志[7]确认,日志记录为“本地”,但如果用户不在校园内,则记录为“代理”。用户请求的URL是日志[5]。此行中的“0”是传输的字节数,日志[6],这是我们不保留的数据。最后,在行的末尾,日志[8]表示引用的URL。此列表中的每个元素现在都可以保存到一个变量中,以供以后使用,而不包括我们以前决定不分析的数据(会话ID和传输的字节数,或日志[4]和日志[6]:

图4.将行的每个部分保存为单独的变量

4 清理和精炼数据

在简单地将所有这些变量记录到一个csv文件中之前,我们首先清理数据并以最终希望能够使用的方式记录它。例如,我们并不真正想要用户的IP地址;我们想要他们的位置。在线上有许多服务可以将IP地址转换成大致的地理位置;有些是付费的,有些是免费的。我们选择使用一个名为ipstack的应用程序,因为它每月可以自由处理多达10000个请求,足以分析一个月的ezproxy日志。

注册服务后,我们收到一个访问密钥,允许我们通过其API运行一个IP地址,并返回包含国家、州/地区和城市的JSON数据,每个数据都被保存,而不是IP地址。如果无法确定位置,API将返回“none”,我们在保存之前将其更改为“unknown”。我们还把城市和国家结合起来,而不仅仅是拯救城市,以消除同名城市的歧义。为了从API中检索数据,我们需要导入文件顶部的请求和JSON模块。

图5.使用ipstack api从IP地址获取位置数据

接下来,我们需要将时间戳数据转换为更容易分析的数据。当使用模拟程序时,我们能够分析日志文件,以了解对ezproxy用户来说,一周中的哪些天和一天中的哪些小时最活跃。我们想在这里记录类似的信息,以及每月的某一天。由于ezproxy记录的所有时区信息都是相同的,因此我们只使用日志[1]删除了该元素,该日志返回了:

图6.从日志文件中提取的原始时间戳数据

为了消除字符串开头的“[”,我们使用一个切片将其修剪掉:

图7.删除额外字符的时间戳数据

我们首先使用“/”分隔时间戳,先给出日期,然后给出月份,最后给出年份和时间。然后我们拼接了year/time元素来提取我们想要的数据,即小时。我们还想找出一周中的哪一天,这样我们就可以分析这些数据了。日志中没有显式地显示这些信息,但我们使用了在日志中使用datetime函数获取这些信息。要使用这个函数,我们需要导入datetime模块,还需要知道年份、表示月份的数字和月份的日期。从时间戳数据中,我们已经得到了所有这些信息,除了月份被保存为月份名称的字符串缩写,而不是数字(“jun”而不是6)。

为了适应这一点,我们创建了一个以月份缩写为键的字典,每个字典都分配了相应的数字值(“jan”:1等)。由于datetime函数返回一个表示工作日的数字(0=Monday、1=Tuesday等),因此我们还创建了一个从Monday开始的工作日列表。这使得我们可以将每月、工作日和一天中的某一天保存到收集的数据中进行分析。

图8.将时间戳解析为单独数据块的代码

日志[7]中的信息向我们提供了有关用户是否通过代理访问资源(即,是否在校园外)的数据。如果一个用户在校园内,他们不需要登录就可以通过代理服务器,这会导致很少收集有关该用户的数据,例如他们的IP(即他们的位置)。为了纠正这个问题,如果用户在校园内,我们会自动保存本地地理数据,以及“校园内”的位置。如果用户通过代理服务器登录,则会将其位置记录为“校园外”。

图9.记录位置数据

最难解析的信息是用户名和URL。因为我们实际上不想记录用户的身份,所以我们必须实现一种方法来获取我们真正想要的信息,这就是他们在大学的地位。为此,我们创建了一个csv文件,其中每个用户名都与从大学同事系统中提取的用户记录中的用户大学状态(在线学生、校内本科生、远程硕士生等)相匹配。在python脚本中打开这个文件之后,我们一行一行地遍历它,将键值对保存到一个名为“users”的字典中,以便以后使用。为此,我们还需要导入csv模块。

图10.创建用户字典

收集的用户名是从日志文件,然后传递到用户字典检索和保存用户的状态,最终discarded与用户名。

图11. the username冰用找到的用户的状态

请求的和引用的URL尤其难以解析,因为捕获的URL通常有几行长,包含许多特殊字符。它们通常也包含我们的代理信息,许多包含搜索查询数据,这是我们既不想要也不需要保留的。

尝试将每个URL与一个单独的数据库相匹配,虽然可能,但这将更加困难,最终会比我们认为需要的数据更加精确。相反,我们创建了一个包含关键字或url片段的csv文件,这些关键字或url片段将较长的url标识为特定提供者资源的一部分。例如,所有包含“ebsco”的URL都将被标识为ebsco数据库的一部分(尽管我们确实分离了来自eds和来自ebsco中搜索的URL,而不是来自链接解析器)。其他数据库提供者和包也以这种方式添加到csv文件中。我们通过这个文件循环创建一个数据库字典,然后使用字典创建一个可以循环访问以匹配每个记录的URL的键列表。

图12.创建数据库字典

由于记录的URL非常笨拙,所以有必要首先将它们剥离到最基本的元素中。我们首先使用re.sub去掉代理前缀的不同变体。接下来,我们将长字符串拆分为较小的部分,方法是在一个常见字符上进行拆分,该字符通常在URL中找到多次(首先是“=”符号,然后是“%”符号),然后只保存第一部分,希望其中包含URL的主域)。如果除去所有代理信息后,没有留下任何内容,那么我们将该URL保存为ezproxy登录URL。如果还剩下什么,我们会运行一个循环,将先前创建的数据库键列表中的每个元素与URL进行比较。如果从列表中找到一个元素,它将用于数据库字典,以获取随后保存的值。这个过程用于引用URL和从日志文件请求的URL。

图13.将URL与数据库匹配

最后,每个保存的元素都被写到一个csv文件中,然后循环将返回到开始处,从日志文件的下一行收集相同的数据。

图14.将数据写入csv文件

5 分析和呈现数据

在这个过程的最后,我们保存了一个完整的原始数据csv文件,用于ezproxy日志文件的月份。虽然将原始数据归档是很有用的,但为了

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。