21

awstats や splunk のような他のツールがあることは知っていますが、R で本格的な (Web) サーバーのログファイル分析が行われているのではないかと思います。R でそれをやろうと思ったのは私が最初ではないかもしれませんが、それでも R には優れた視覚化機能があります。機能と優れた空間パッケージ。どれか知っていますか?または、構築できる最も一般的なログ ファイル形式を処理する R パッケージ/コードはありますか? それとも単に非常に悪い考えですか?

4

5 に答える 5

14

Network Ops 担当者向けの分析ツールボックスを構築するプロジェクトに関連して、私は約 2 か月前にこれらのツールボックスの 1 つを構築しました。雇用主はオープンソース化しても問題ないので、興味のある人は私の github レポジトリにアップできます。Rパッケージをビルドすると、このグループにとって最も役立つと思います。ただし、R 以外のコードを使用したパッケージのビルドに関するドキュメントを調査する必要があるため、すぐにそれを行うことはできません (適切な Python ランタイムと共に /exec にある Python バイトコード ファイルを投げるのと同じくらい簡単かもしれませんが、何も思いつきません)。

この種のプロジェクトに着手する必要があることに、私は実際に驚きました。少なくともいくつかの優れたオープン ソースおよび無料のログ ファイル パーサー/ビューアー (優れた Webalyzer と AWStats を含む) がありますが、どちらもサーバーエラー ログを解析しません(サーバー アクセス ログの解析は両方の主な使用例です)。

エラー ログ、またはエラー ログとアクセス ログの違いに慣れていない場合、要するに、Apache サーバー (likewsie、nginx、および IIS) は 2 つの異なるログを記録し、デフォルトで同じディレクトリに並べてディスクに保存します。Mac OS X では、ルートのすぐ下にある /var のディレクトリ:

$> pwd
   /var/log/apache2

$> ls
   access_log   error_log

ネットワーク診断では、アクセス ログよりもエラー ログの方がはるかに役立つことがよくあります。また、多くのフィールドのデータが構造化されていないため、さらに処理が非常に難しくなります。さらに重要なのは、解析後に残るデータ ファイルが不規則な時系列であるためです。複数のエントリがキー化されている可能性があります。次のエントリは 3 秒後、というように続きます。

生のエラー ログ (任意のサイズですが、通常は一度に数百 MB) を放り込めるアプリが必要でした。この場合、事前にパッケージ化された分析とコマンドライン分析用に R 内で使用できるデータ キューブもあります。これを考慮して、生ログ パーサーを Python でコーディングし、プロセッサ (パーサー出力をグリッド化して定期的な時系列を作成するなど) とすべての分析とデータの視覚化を R でコーディングしました。

私は長い間分析ツールを構築してきましたが、R を使用したのは過去 4 年間だけです。生のログ ファイルを解析し、データ フレームを R にロードした直後の私の第一印象は、R がいかに楽しいかということです。この種のタスクにどのように適しているかを説明します。いくつかの歓迎すべき驚き:

  • 連載。R で作業データを永続化するのは、1 つのコマンド (保存) です。これは知っていましたが、このバイナリ形式がどれほど効率的かは知りませんでした。実際のデータ: 解析された 50 MB の生のログファイルごとに、.RData 表現は約 500 KB でした (100:1 圧縮)。(注: data.table ライブラリを使用し、保存関数に圧縮レベル引数を手動で設定することにより、これをさらに約 300 : 1 に押し下げました);

  • イオ。私のデータ ウェアハウスは、完全に RAM に常駐し、redis と呼ばれる非同期でディスクに書き込む軽量のデータ構造サーバーに大きく依存しています。プロジェクト自体はわずか 2 年ほどしか経っていませんが、CRAN には R 用の redis クライアントが既に存在します (この記事の時点で BW Lewis によるバージョン 1.6.1)。

  • 一次データ分析. このプロジェクトの目的は、ネットワーク運用担当者が使用するライブラリを構築することでした。私の目標は、「1 つのコマンド = 1 つのデータ ビュー」タイプのインターフェイスでした。たとえば、優れた googleVis パッケージを使用して、並べ替え可能な列を含むプロ並みのスクロール可能/ページ付けされた HTML テーブルを作成し、そこに集約データ (>5,000 行) のデータ フレームをロードしました。いくつかのインタラクティブな要素 (列の並べ替えなど) だけで、有用な記述的分析が提供されました。もう 1 つの例として、いくつかの基本的なデータ ジャグリングとテーブルのような関数に対して、多くのシン ラッパーを作成しました。たとえば、これらの各関数を、タブ付き Web ページのクリック可能なボタンにバインドします。繰り返しますが、これは R で行うのが楽しみでした。その理由の 1 つは、関数がラッパーを必要としないことが非常に多いためです。

最後の箇条書きのいくつかの例:

# 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 を使用して表示され

googleVis を使用した対話型分析用に表示されるプライマリ データ キューブ

た分割表 (xtab 関数呼び出しから)

ここに画像の説明を入力

于 2011-07-13T01:50:28.130 に答える
9

実際、それは素晴らしいアイデアです。Rはまた、非常に優れた日付/時刻機能を備えており、クラスター分析を実行したり、さまざまな機械学習アルゴリズムを使用したりできます。また、解析などを行う3つの異なる正規表現エンジンを備えています。

そして、それは斬新なアイデアではないかもしれません。数年前、私はRを使用してプロアクティブな(リアクティブではなく)ログファイル分析を行っている人と簡単にメールで連絡を取りました。ログを読み、(彼らの場合は)時系列モデルを作成し、ホットスポットを予測します。それは明らかに良い考えです。それはエネルギー省研究所の1つでしたが、私はもうURLを持っていません。時間的パターンの外でも、ここでできることはたくさんあります。

于 2011-04-14T14:48:12.347 に答える
4

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) ]
于 2014-04-25T15:00:11.277 に答える
1
#!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, -

この形式は、read.csv を使用して R に簡単に読み込むことができます。また、サードパーティのライブラリは必要ありません。

于 2016-04-09T03:55:10.873 に答える
1

私は最近、R を使用してログファイル分析を行いました。この作業には、R の組み込み関数で十分でした。
私のログファイルは約 10 GB だったので、問題はデータ ストレージでした。Revolutions R は、このようなビッグ データを処理する新しい方法を提供しますが、最終的にバックエンドとして MySQL データベースを使用することにしました (実際、正規化によってサイズが 2 GB に縮小されました)。
これにより、R でログファイルを読み取る際の問題も解決できます。

于 2011-04-15T07:06:04.933 に答える