В связи с проектом по созданию набора инструментов аналитики для наших ребят из Network Ops, я создал один из них около двух месяцев назад.У моего работодателя нет проблем, если я с открытым исходным кодом, поэтому, если кто-то заинтересован, я могу разместить его на моем репозитории GitHub.Я предполагаю, что это наиболее полезно для этой группы, если я создаю Пакет R.Я не смогу сделать это сразу же, потому что мне нужно исследовать документы по сборке пакетов с использованием кода не-R (это может быть так же просто, как выбросить файлы байт-кода python в / exec вместе с подходящей средой выполнения python, ноя понятия не имею).
Я был действительно удивлен, что мне нужно было предпринять проект такого рода.Существует по крайней мере несколько превосходных анализаторов / просмотрщиков файлов с открытым исходным кодом и бесплатных журналов (включая превосходные Webalyzer и AWStats), но ни один из них не анализирует сервер журналы ошибок (синтаксический анализ журналов доступа к серверу является основным вариантом использования обоих).
Если вы не знакомы с журналами ошибок или с разницей между ними и журналами доступа, в итоге серверы Apache (likewsie, nginx и IIS) записывают два разных журнала и по умолчанию сохраняют их на диске рядом друг с другом.в том же каталоге.В Mac OS X этот каталог в / var находится чуть ниже root:
$> 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 и вручную установив аргумент уровня сжатия для функции сохранения);
IO .Мое хранилище данных в значительной степени опирается на облегченный сервер структур данных, который полностью находится в ОЗУ и выполняет асинхронную запись на диск, который называется redis.Самому проекту всего около двух лет, но в CRAN уже есть клиент Redis для R (автор BW 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)