Анализ файла журнала в R? - PullRequest
21 голосов
/ 14 апреля 2011

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

Ответы [ 5 ]

14 голосов
/ 13 июля 2011

В связи с проектом по созданию набора инструментов аналитики для наших ребят из 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 :

The Primary Data Cube Displayed for Interactive Analysis Using googleVis

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

enter image description here

9 голосов
/ 14 апреля 2011

Это на самом деле отличная идея.R также обладает очень хорошими возможностями даты / времени, может выполнять кластерный анализ или использовать любые алгоритмы машинного обучения, имеет три различных механизма регулярных выражений для анализа и т. П.

И это не может быть новой идеей.Несколько лет назад я кратко связался по электронной почте с кем-то, кто использовал R для упреждающего (а не реактивного) анализа файла журнала: читайте журналы, (в их случае) создавайте модели временных рядов, предсказывайте горячие точки.Это, очевидно, хорошая идея.Это была одна из лабораторий Министерства энергетики, но у меня больше нет URL.Даже вне временных паттернов много можно сделать здесь.

4 голосов
/ 25 апреля 2014

Я использовал 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) ]
1 голос
/ 09 апреля 2016
#!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. И не требует никаких сторонних библиотек.

1 голос
/ 15 апреля 2011

Я недавно сделал анализ файла журнала, используя R. Это не было чем-то сложным, в основном описательными таблицами.Встроенных функций R было достаточно для этой работы.
Проблема заключалась в хранении данных, поскольку мои файлы журналов занимали около 10 ГБ.Revolutions R действительно предлагает новые методы для обработки таких больших данных, но я наконец-то решил использовать базу данных MySQL в качестве бэкэнда (что фактически уменьшило размер до 2 ГБ при нормализации).
Это также может решить вашу проблему вчтение лог файлов в R.

...