Я знаю, что есть другие инструменты, такие как awstats или splunk, но мне интересно, есть ли в R какой-то серьезный анализ файла журнала (веб-сервера). Возможно, я не первый, кто решил сделать это в R, но все же R имеет хорошую визуализацию. возможности, а также хорошие пространственные пакеты. Вы знаете какой-нибудь? Или есть пакет / код R, который обрабатывает наиболее распространенные форматы файлов журналов, на которых можно было бы основываться? Или это просто очень плохая идея?
Анализ файла журнала в R?
Ответы (5)
В связи с проектом по созданию набора аналитических инструментов для наших парней из Network Ops я создал один из них около двух месяцев назад. У моего работодателя нет проблем, если я открою его исходный код, поэтому, если кому-то интересно, я могу разместить его в моем репозитории github. Я предполагаю, что для этой группы будет наиболее полезно, если я соберу пакет R. Я не смогу сделать это сразу, потому что мне нужно изучить документы по сборке пакетов с кодом, отличным от R (это может быть так же просто, как бросить файлы байт-кода Python в /exec вместе с подходящей средой выполнения Python, но Я понятия не имею).
Я был на самом деле удивлен, что мне нужно было взяться за проект такого рода. Существует как минимум несколько отличных бесплатных анализаторов/просмотрщиков файлов журналов с открытым исходным кодом (включая превосходные Webalyzer и AWStats), но ни один из них не анализирует серверные журналы ошибок (анализ журналов доступа к серверу является основным вариантом использования для обоих).
Если вы не знакомы с журналами ошибок или с разницей между ними и журналами доступа, в итоге серверы Apache (например, nginx и IIS) записывают два разных журнала и по умолчанию сохраняют их на диск рядом друг с другом в одном и том же каталоге. В Mac OS X этот каталог в /var, чуть ниже корня:
$> pwd
/var/log/apache2
$> ls
access_log error_log
Для диагностики сети журналы ошибок часто гораздо полезнее, чем журналы доступа. Их также значительно сложнее обрабатывать из-за неструктурированного характера данных во многих полях и, что более важно, из-за того, что файл данных, который у вас остается после синтаксического анализа, представляет собой нерегулярный временной ряд — у вас может быть несколько введенных записей. к одной отметке времени, затем следующая запись будет через три секунды и так далее.
я хотел, чтобы приложение, которое я мог бы подбрасывать в необработанные журналы ошибок (любого размера, но обычно несколько сотен МБ за раз), имело что-то полезное на другом конце — что в данном случае должно было быть предварительно упакованной аналитикой и также куб данных, доступный внутри R для аналитики из командной строки. Учитывая это, я закодировал синтаксический анализатор необработанных журналов на python, а процессор (например, сетку вывода синтаксического анализатора для создания регулярного временного ряда) и всю аналитику и визуализацию данных я закодировал на R.
Я давно занимаюсь созданием аналитических инструментов, но только последние четыре года я использую R. Итак, мое первое впечатление — сразу после разбора необработанного файла журнала и загрузки фрейма данных в R — это то, что такое R — удовольствие. для работы и как он так хорошо подходит для задач такого рода. Несколько приятных сюрпризов:
Сериализация. Чтобы сохранить рабочие данные в R, достаточно одной команды (сохранить). Я знал это, но не знал, насколько эффективен этот двоичный формат. Фактические данные: на каждые 50 МБ проанализированных необработанных файлов журналов представление .RData составляло около 500 КБ — сжатие 100:1. (Примечание: я уменьшил это значение примерно до 300: 1, используя библиотеку data.table и вручную установив аргумент уровня сжатия для функции сохранения);
Ввод-вывод. Мое хранилище данных в значительной степени зависит от облегченного сервера структуры данных, который полностью находится в оперативной памяти и асинхронно записывает на диск, который называется Redis. Самому проекту всего около двух лет, но в CRAN уже есть клиент Redis для R (автор B.W. Lewis, версия 1.6.1 на момент публикации);
Первичный анализ данных. Цель этого проекта состояла в том, чтобы создать библиотеку для наших парней из Network Ops. Моей целью был интерфейс типа «одна команда = одно представление данных». Так, например, я использовал отличный пакет googleVis для создания профессионально выглядящих HTML-таблиц с прокруткой/разбивкой на страницы с сортируемыми столбцами, в которые я загрузил фрейм данных агрегированных данных (> 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)
< br/>
На самом деле это отличная идея. R также имеет очень хорошие возможности даты/времени, может выполнять кластерный анализ или использовать любые алгоритмы машинного обучения, имеет три разных механизма регулярных выражений для анализа и т. д. стр.
И это может быть не новая идея. Несколько лет назад я переписывался по электронной почте с кем-то, кто использует 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 ГБ. Revolutions R действительно предлагает новые методы обработки таких больших данных, но я, наконец, решил использовать базу данных MySQL в качестве серверной части (что фактически уменьшило размер до 2 ГБ за счет нормализации).
Это также может решить вашу проблему в чтение лог-файлов в 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, -
Этот формат можно легко прочитать в R с помощью read.csv. И это не требует никаких сторонних библиотек.
readLogFile
для проекта. Это оказалось весьма полезным. Не так уж сложно написать свой собственный. Просто обработка текста и индексация. - person Rich Scriven   schedule 25.04.2014