Подтвердить что ты не робот

Анализ журналов в R?

Я знаю, что есть другие инструменты, такие как awstats или splunk, но мне интересно, существует ли какой-то серьезный (веб-сервер) анализ лог файла, который происходит в R. Я, возможно, не первый думал сделать это в R, но все же R имеет хорошие возможности визуализации, а также приятные пространственные пакеты. Вы знаете что-нибудь? Или есть R-пакет/код, который обрабатывает наиболее распространенные форматы файлов журнала, на которых можно было бы строить? Или это просто очень плохая идея?

4b9b3361

Ответ 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:

The Primary Data Cube Displayed for Interactive Analysis Using googleVis

Таблица непредвиденных обстоятельств (из вызова функции xtab), отображаемая с помощью googleVis)

enter image description here

Ответ 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. И это не требует каких-либо сторонних библиотек.