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

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


person Matt Bannert    schedule 14.04.2011    source источник
comment
перефразируя @Dirk: я с нетерпением жду этого пакета ...   -  person Joris Meys    schedule 14.04.2011
comment
В прошлом году я написал довольно красивую (и длинную) функцию readLogFile для проекта. Это оказалось весьма полезным. Не так уж сложно написать свой собственный. Просто обработка текста и индексация.   -  person Rich Scriven    schedule 25.04.2014


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

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

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

person doug    schedule 13.07.2011
comment
Дуг, звучит прекрасно. Я могу попытаться помочь с упаковкой R - например. Сценарии Python не являются проблемой, так как другие пакеты поставляются со своим собственным Perl (например, gdata, который использует пакет Perl для чтения файлов xls) или Java jar (несколько пакетов). - person Dirk Eddelbuettel; 14.07.2011

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

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

person Dirk Eddelbuettel    schedule 14.04.2011
comment
+1, опытное мнение определенно поможет отчужденному пользователю. В свою очередь, если идея была не так уж плоха, мне интересно, не были ли уже сделаны самые основные вещи, такие как анализ журналов на основе строк и выбор разных IP-адресов ... - person Matt Bannert; 14.04.2011
comment
Так много предстоит сделать, так мало времени. Не все, что должно быть сделано, также делается. Вот почему открытый исходный код — это весело: Ваш зуд, ваш проект. - person Dirk Eddelbuettel; 14.04.2011
comment
хорошо, мне начинает нравиться. Итак, я думаю, нужно начать читать, чтобы увидеть, прекращается ли зуд или продолжается ... какие-либо предложения от инструментов, написанных на других языках / концепциях? - person Matt Bannert; 14.04.2011

Я использовал 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) ]
person Mickc    schedule 25.04.2014

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

person ahs85    schedule 15.04.2011
comment
на самом деле это звучит интересно, так как я уже немного работал с RMySQL. Но чего я не вижу, так это того, как я должен читать файлы журналов в MySQL. Я думаю, что выше мы обсуждали пакет для анализа наиболее распространенных форматов лог-файлов (локально). Однако у вас есть какой-либо ресурс, кикстарт, ссылка или что-то еще? - person Matt Bannert; 15.04.2011
comment
Я нашел perl-скрипт здесь. У меня был собственный формат файла журнала, поэтому я немного изменил сценарий. С обычными лог-файлами должно работать. - person ahs85; 19.04.2011

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

person hd1    schedule 09.04.2016