Я знаю, что есть другие инструменты, такие как awstats или splunk, но мне интересно, существует ли какой-то серьезный (веб-сервер) анализ лог файла, который происходит в R. Я, возможно, не первый думал сделать это в R, но все же R имеет хорошие возможности визуализации, а также приятные пространственные пакеты. Вы знаете что-нибудь? Или есть R-пакет/код, который обрабатывает наиболее распространенные форматы файлов журнала, на которых можно было бы строить? Или это просто очень плохая идея?
Анализ журналов в R?
Ответ 1
В связи с проектом по созданию инструментария для инструментов для наших парней, Я построил один из них около двух месяцев назад. У моего работодателя нет проблем, если я его открываю, поэтому, если кто-то заинтересован, я могу поставить его на моем реестре github. Я считаю, что это наиболее полезно для этой группы, если я создаю R-пакет. Я не смогу сделать это сразу, хотя потому что мне нужно исследовать документы по созданию пакетов с помощью кода, отличного от R (это может быть так же просто, как бросить файлы байт-кода python в /exec вместе с подходящей исполняемой средой python, но я понятия не имею).
Я действительно был удивлен, что мне нужно провести такой проект. Есть, по крайней мере, несколько превосходных open-source и бесплатных парсеров/зрителей файлов журналов (включая превосходные Webalyzer и AWStats), но ни журналы журналов анализа данных (журналы сеанса синтаксического анализа не являются основным вариантом использования для обоих).
Если вы не знакомы с журналами ошибок или с разницей между ними и доступом logs, в общем, серверы Apache (likewsie, nginx и IIS) записывают два разных журнала и сохраняют их на диске по умолчанию рядом друг с другом в том же каталоге. В Mac OS X, этот каталог в /var, чуть ниже root:
$> pwd
/var/log/apache2
$> ls
access_log error_log
Для диагностики сети журналы ошибок часто гораздо полезнее журналов доступа. Они также значительно сложнее обрабатывать из-за неструктурированного характера данных во многих областях и более значительно, поскольку файл данных вы остаетесь после того, как синтаксический анализ является нерегулярным временным рядом - у вас может быть несколько записей, привязанных к одной временной метке, затем следующая запись - через три секунды и т.д.
Мне нужно приложение, которое я мог бы забрасывать в необработанные журналы ошибок (любого размера, но обычно несколько сотен МБ за раз), имеет что-то полезное, выходящее из другого конца - которое в этом случае должно было быть пре- упакованную аналитику, а также куб данных, доступный внутри R для анализа командной строки. Учитывая это, я закодировал синтаксический анализатор raw-log в python, в то время как процессор (например, грид-вывод парсера для создания регулярного временного ряда) и все аналитики и визуализация данных, я закодированные в R.
Я долгое время создавал инструменты для аналитики, но только в прошлом четыре года я использовал R. Таким образом, мое первое впечатление - сразу после разбора необработанного файла журнала и загрузки кадра данных в R - это то, с чем приятно работать R и как оно так хорошо подходит для задач такого рода. Несколько приятных сюрпризов:
-
Сериализация. Для сохранения рабочих данных в R есть одна команда (спасти). Я знал это, но я не знал, насколько эффективен этот двоичный формат. Фактические данные: на каждые 50 МБ сырых логфайлов проанализированы .RData представляет собой сжатие около 500 КБ - 100: 1. (Примечание: i подтолкнуло это примерно на 300: 1, используя таблицу данных. библиотеки и вручную задайте аргумент уровня сжатия для сохранения функция);
-
IO. My Data Warehouse в значительной степени опирается на легкую структуру данных сервер, который полностью находится в ОЗУ и записывает на диск асинхронно, называется redis. Сам по себе вопрос состоит лишь в двух лет, но уже есть клиент redis для R в CRAN (by B.W. Льюис, версия 1.6.1 на этом посту);
-
Первичный анализ данных. Целью этого Проекта было создание Библиотека для нашей сети. Ребята из Ops. Моя цель была "одна команда = один вид данных ". Так, например, я использовал отличный пакет googleVis для создания профессионально выглядящего прокручиваемые/разбитые на страницы таблицы HTML с сортируемыми столбцами, в которых i загрузил кадр данных агрегированных данных ( > 5000 строк). Только те немногие интерактивные эльмы - например, сортировка столбца - доставка полезных описательная аналитика. Другой пример: я написал много тонких обертки над некоторыми манипуляциями с данными и табличными функциями; каждый из этих функций я бы, например, привязал к кнопке с нажатием кнопки на веб-странице с вкладками. Опять же, это было приятно сделать в 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:
Таблица непредвиденных обстоятельств (из вызова функции xtab), отображаемая с помощью googleVis)
Ответ 2
На самом деле это отличная идея. R также обладает очень хорошими возможностями по дате/времени, может выполнять кластерный анализ или использовать любое разнообразие алгоритмов машинного обучения, имеет три разных механизма регулярного выражения для анализа и т.д.
И это может быть не новая идея. Несколько лет назад я был в кратковременном обращении к электронной почте с кем-то, использующим R для активного (а не реактивного) анализа лог файла: Прочитайте журналы, (в их случае), постройте модели временных рядов, предскажите горячие точки. Это так очевидно хорошая идея. Это была одна из лабораторий Департамента энергетики, но у меня больше нет URL-адреса. Даже вне временных шаблонов здесь можно многое сделать.
Ответ 3
Я использовал 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) ]
Ответ 4
Недавно я использовал анализ logfile, используя R. Это не было настоящей сложной вещью, в основном описательными таблицами. Для этой работы было достаточно R-функций.
Проблема заключалась в хранении данных, так как мои лог файлы составляли около 10 ГБ. Revolutions R предлагает новые методы обработки таких больших данных, но я наконец решил использовать MySQL-базу данных в качестве бэкэнд (что фактически уменьшало размер до 2 ГБ, хотя нормализация).
Это также может решить вашу проблему при чтении лог файлов в R.
Ответ 5
#!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, -
Этот формат можно легко прочитать в R, используя read.csv. И это не требует каких-либо сторонних библиотек.