R中的日志文件分析?

| 我知道周围还有其他工具,例如awstats或splunk,但我想知道R中是否进行了一些认真的(网络)服务器日志文件分析。我可能不是第一个想到在R中进行此操作的人,但R仍然具有很好的可视化效果功能以及不错的空间包装。你知道吗还是有一种R软件包/代码可以处理可以构建的最常见的日志文件格式?还是仅仅是一个非常糟糕的主意?     
已邀请:
与为我们的网络运营人员构建分析工具箱的项目相关, 我在大约两个月前建立了其中之一。如果我将其开源,我的雇主没有问题,所以如果有人感兴趣,我可以将其放在我的github仓库中。我认为,如果我构建一个R Package,这对这个小组来说最有用。我虽然不能马上做 因为我需要研究使用非R代码进行程序包构建的文档(它可能很简单,就像将/ exec中的python字节码文件与合适的python运行时一样扔掉,但我不知道)。 实际上让我感到惊讶的是,我需要进行这样的项目。至少有几个出色的开源和免费日志文件解析器/查看器(包括出色的Webalyzer和AWStats),但都不解析服务器错误日志(解析服务器访问日志是两者的主要用例)。 如果您不熟悉错误日志或它们与访问权限之间的区别 总之,Apache服务器(likewsie,nginx和IIS)记录了两个不同的日志,并且默认情况下将它们彼此相邻地存储在磁盘中同一目录中。在Mac OS X上, / var中根目录下的目录:
$> pwd
   /var/log/apache2

$> ls
   access_log   error_log
对于网络诊断,错误日志通常比访问日志有用得多。 由于许多字段中数据的非结构化性质,它们也恰好更难以处理,更重要的是,因为数据文件 解析是一个不规则的时间序列后,您会留下来-您可能有多个条目被键入单个时间戳,然后下一个条目是三秒钟后,依此类推。 我想要一个可以抛入原始错误日志(任何大小,但一次通常数百MB)的应用程序,从另一端输出有用的东西-在这种情况下,必须进行一些预先打包的分析, R中还有一个用于命令行分析的数据立方体。鉴于此,我用python编写了原始日志解析器,而处理器(例如,将解析器的输出网格化以创建规则的时间序列)以及所有分析和数据可视化都用R进行了编码。 我已经建立了很长时间的分析工具,但仅在过去 我使用R已经有四年了。所以,我的第一印象-解析原始日志文件并将数据帧加载到R中后,R便很高兴能够使用R,并且它非常适合此类任务。一些令人惊讶的惊喜: 序列化。将工作数据持久保存在R中是一个命令 (保存)。我知道这个,但是我不知道这个二进制文件有多有效 格式。您的实际数据:每解析50 MB的原始日志文件, RData表示约为500 KB--100:1压缩。 (注意:我 通过使用data.table将其进一步降低到大约300:1 库并将压缩级别参数手动设置为保存 功能); IO。我的数据仓库严重依赖轻量级数据结构 服务器完全驻留在RAM中并写入磁盘 异步地称为redis。该项目本身只有两个 已有30年的历史了,但CRAN中已经有R的redis客户(由B.W. 刘易斯,本文发布的版本1.6.1); 原始数据分析。该项目的目的是建立一个 供网络运营人员使用的库。我的目标是\“一个命令= 一个数据视图类型界面。例如,我使用了出色的 googleVis套件,打造专业外观 具有可排序列的可滚动/分页HTML表,其中 加载了聚合数据的数据帧(> 5,000行)。只是那几个 交互式元素-例如,对列进行排序-很有用 描述性分析。另一个例子,我写了很多薄 包装一些基本的数据处理和类似表的功能;每 例如,将这些功能绑定到可点击的按钮 在选项卡式网页上。同样,这是我在R中的荣幸,部分原因 因为很多时候该函数不需要包装器,单个 带有提供的参数的命令足以生成有用的 数据视图。 最后一个项目符号的几个示例:
# what are the most common issues that cause an error to be logged?

err_order = function(df){
    t0 = xtabs(~Issue_Descr, df)
    m = cbind( names(t0), t0)
    rownames(m) = NULL
    colnames(m) = c(\"Cause\", \"Count\")
    x = m[,2]
    x = as.numeric(x)
    ndx = order(x, decreasing=T)
    m = m[ndx,]
    m1 = data.frame(Cause=m[,1], Count=as.numeric(m[,2]),
                    CountAsProp=100*as.numeric(m[,2])/dim(df)[1])
    subset(m1, CountAsProp >= 1.)
}

# calling this function, passing in a data frame, returns something like:


                        Cause       Count    CountAsProp
1  \'connect to unix://var/ failed\'    200        40.0
2  \'object buffered to temp file\'     185        37.0
3  \'connection refused\'                94        18.8
显示用于使用googleVis进行交互式分析的主数据多维数据集: 使用googleVis显示的列联表(来自xtab函数调用)     
实际上,这是一个绝妙的主意。 R还具有很好的日期/时间功能,可以进行聚类分析或使用任何种类的机器学习算法,具有三个不同的正则表达式引擎来解析等pp。 这可能不是一个新颖的想法。几年前,我与使用R进行主动(而非被动)日志文件分析的人进行了简短的电子邮件联系:读取日志(以他们为例)建立时间序列模型,预测热点。那显然是个好主意。它是能源部实验室的其中之一,但我不再有URL。即使在时间模式之外,这里也可以做很多事情。     
我已经使用R加载并解析IIS日志文件,并且取得了一些成功,这是我的代码。
Load IIS Log files
require(data.table)

setwd(\"Log File Directory\")

# get a list of all the log files
log_files <- Sys.glob(\"*.log\")

# This line
# 1) reads each log file
# 2) concatenates them
IIS <- do.call( \"rbind\", lapply( log_files,  read.csv, sep = \" \", header = FALSE, comment.char = \"#\", na.strings = \"-\" ) )

# Add field names - Copy the \"Fields\" line from one of the log files :header line 
colnames(IIS) <- c(\"date\", \"time\", \"s_ip\", \"cs_method\", \"cs_uri_stem\", \"cs_uri_query\", \"s_port\", \"cs_username\", \"c_ip\", \"cs_User_Agent\", \"sc_status\", \"sc_substatus\", \"sc_win32_status\", \"sc_bytes\", \"cs_bytes\", \"time-taken\")

#Change it to a data.table
IIS <- data.table( IIS )

#Query at will
IIS[, .N, by = list(sc_status,cs_username, cs_uri_stem,sc_win32_status) ]
    
我最近使用R做了一个日志文件分析。这不是真正的复杂内容,主要是描述性表。 R \的内置函数足以完成此任务。 问题是数据存储,因为我的日志文件约为10 GB。 Revolutions R确实提供了处理此类大数据的新方法,但我最终决定使用MySQL数据库作为后端(实际上,通过规范化将其大小减小到2 GB)。 那也可以解决您在R中读取日志文件时遇到的问题。     
#!python

import argparse
import csv
import cStringIO as StringIO

class OurDialect:
    escapechar = \',\'
    delimiter = \' \'
    quoting = csv.QUOTE_NONE


parser = argparse.ArgumentParser()
parser.add_argument(\'-f\', \'--source\', type=str, dest=\'line\', default=[[\'\'\'54.67.81.141 - - [01/Apr/2015:13:39:22 +0000] \"GET / HTTP/1.1\" 502 173 \"-\" \"curl/7.41.0\" \"-\"\'\'\'], [\'\'\'54.67.81.141 - - [01/Apr/2015:13:39:22 +0000] \"GET / HTTP/1.1\" 502 173 \"-\" \"curl/7.41.0\" \"-\"\'\'\']])
arguments = parser.parse_args()

try:
    with open(arguments.line, \'wb\') as fin:
        line = fin.readlines()
except: 
    pass
finally:
    line = arguments.line

header = [\'IP\', \'Ident\', \'User\', \'Timestamp\', \'Offset\', \'HTTP Verb\', \'HTTP Endpoint\', \'HTTP Version\', \'HTTP Return code\', \'Size in bytes\', \'User-Agent\']

lines = [[l[:-1].replace(\'[\', \'\"\').replace(\']\', \'\"\').replace(\'\"\', \'\') for l in l1] for l1 in line]

out = StringIO.StringIO()

writer = csv.writer(out)
writer.writerow(header)

writer = csv.writer(out,dialect=OurDialect)
writer.writerows([[l1 for l1 in l] for l in lines])

print(out.getvalue())
演示输出:
IP,Ident,User,Timestamp,Offset,HTTP Verb,HTTP Endpoint,HTTP Version,HTTP Return code,Size in bytes,User-Agent
54.67.81.141, -, -, 01/Apr/2015:13:39:22, +0000, GET, /, HTTP/1.1, 502, 173, -, curl/7.41.0, -
54.67.81.141, -, -, 01/Apr/2015:13:39:22, +0000, GET, /, HTTP/1.1, 502, 173, -, curl/7.41.0, -
使用read.csv可以很容易地将此​​格式读入R。而且,它不需要任何第三方库。     

要回复问题请先登录注册