Soru R logfile analizi?


Awstats veya splunk gibi başka araçlar olduğunu biliyorum, ama bazı ciddi (web) sunucu log dosyası analizlerinin olup olmadığını merak ediyorum. R'de ilk aklıma gelmeyebilirim ama yine de R'nin güzel görselleştirmesi var. yetenekleri ve ayrıca güzel mekansal paketler. Hiç biliyor musun? Ya da üzerinde inşa edebileceği en yaygın günlük dosyası formatlarını işleyen bir R paketi / kodu var mı? Yoksa sadece çok kötü bir fikir mi?


21
2018-04-14 14:44


Menşei


@Dirk paraphraze: Bu paketi bekliyorum ... - Joris Meys
Oldukça güzel (ve uzun) yazdım readLogFile Geçen yıl bir proje için işlev. Oldukça yararlı olduğu ortaya çıktı. Kendi yazman çok zor değil. Sadece metin işleme ve indeksleme. - Rich Scriven


Cevaplar:


Network Ops görevlileri için bir analiz araç kutusu oluşturmak için bir proje ile bağlantılı olarak, Yaklaşık iki ay önce bunlardan birini inşa ettim. Kaynakçı açsam, işverenim hiç sorun değil, eğer ilgilenirseniz, onu github repo'ma koyabilirim. Bir R Paketi oluşturursam, bu grup için en yararlı olduğunu düşünüyorum. Bunu hemen yapamayacağım. çünkü R kodlu olmayan bir paket oluşturma konusunda dokümanlar araştırmam gerekiyor (python bytecode dosyalarını / psing içinde uygun bir python çalışma zamanı ile birlikte atmak kadar basit olabilir, ama hiçbir fikrim yok).

Aslında bu tür bir projeyi üstlenmem gerektiğine şaşırdım. En azından birkaç mükemmel açık kaynak ve ücretsiz günlük dosyası ayrıştırıcıları / görüntüleyicileri (mükemmel Webalyzer ve AWStats dahil) vardır, ancak ne ayrıştırıcı sunucu hata günlükleri (sunucu erişim günlüklerini ayrıştırma, her ikisi için de birincil kullanım durumudur).

Hata günlüklerini veya aralarındaki farkla ilgili bilgi sahibi değilseniz Özetle, Apache sunucuları (benzer şekilde, nginx ve IIS) iki ayrı kaydı kaydeder ve bunları aynı dizinde birbirleriyle varsayılan olarak diske saklar. Mac OS X'te bu dizin / var, root'un hemen altında:

$> pwd
   /var/log/apache2

$> ls
   access_log   error_log

Ağ teşhisi için, hata günlükleri genellikle erişim günlüklerinden çok daha faydalıdır. Ayrıca, verilerin bir çoğunda verilerin yapısal olmayan yapısı ve daha da önemlisi veri dosyası nedeniyle daha da zor hale gelirler. ayrıştırmadan sonra düzensiz bir zaman dizisidir - tek bir zaman damgasına yazılan birden çok girişiniz olabilir, sonraki giriş üç saniye sonra, vb.

Ham hata kayıtlarına (her boyutta, ancak genellikle birkaç yüz MB) atmak istediğim bir uygulamanın, diğer uçta yararlı olan bir şeye sahip olmasını istedim - bu durumda, önceden paketlenmiş analitik ve Ayrıca komut satırı analitiği için R içinde mevcut bir veri küpü. Bunu göz önünde bulundurarak, işlemcinin (örneğin, normal bir zaman dizisi oluşturmak için ayrıştırıcı çıktısını kılavuzlayan) ve tüm analitik ve veri görselleştirmesini gerçekleştirdiğimde, ben P kodunda ham log ayrıştırıcısını kodladım.

Analiz araçlarını uzun zamandır yapıyorum, ancak sadece geçmişte Dört yıl önce R'yi kullanıyorum. İlk izlenimim - hemen bir ham log dosyasını ayrıştırmak ve veri çerçevesini R'ye yüklemek, R'nin çalışmak için bir zevk ve bu türden işler için bu kadar uygun olması. Birkaç hoş sürpriz:

  • serileştirme. R'de çalışma verisini sürdürmek tek bir komuttur (kayıt etmek). Bunu biliyordum, ama bu ikili ne kadar verimli olduğunu bilmiyordum biçim. Gerçek veriler: ayrıştırılan her 50 MB işlenmemiş günlük dosyası için .RData gösterimi yaklaşık 500 KB - 100: 1 sıkıştırma idi. (Not: ben bunu data.table kullanarak yaklaşık 300: 1'e itti. kütüphane ve sıkıştırma seviyesi argümanını el ile kaydetme fonksiyonu);

  • IO. Veri Ambarım, ağırlıklı olarak hafif bir veri yapısına dayanıyor Tamamen RAM'da bulunan ve diske yazılan sunucu asenkronize olarak redis denir. Prosedür kendisi sadece iki yaşında, henüz CRAN'da R için bir redis istemcisi var (B.W. Lewis, bu yazıya ait 1.6.1 sürümü);

  • Birincil Veri Analizi. Bu projenin amacı bir Kullanılacak Ağ Ops çocuklar için kütüphane. Amacım bir "tek komut" idi. bir veri görünümü "tipi arabirim. Örneğin, mükemmel kullandım profesyonel görünümlü bir görünüm oluşturmak için googleVis Paketi Aranabilir sütunlarla kaydırılabilir / paginated HTML tabloları toplanmış verilerin bir veri çerçevesini yükledi (> 5.000 satır). Sadece birkaç etkileşimli elemeler - ör., bir sütun ayırma - yararlı açıklayıcı analitik. Başka bir örnek, çok ince yazdım bazı temel veri hokkabazlık ve masa benzeri işlevler üzerinde sarmalayıcılar; her Bu işlevlerin örneğin, tıklanabilir bir düğmeye bağladım sekmeli bir web sayfasında. Yine, bu R'de bir zevkti, kısmen oldukça sık yapıcı işlevi, hiçbir sarmalayıcı gerektirmez, tek Sağlanan argümanlar ile komut, yararlı bir şekilde oluşturmak için yeterliydi verilerin görünümü.

Son merminin birkaç örneği:

# 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 kullanarak Etkileşimli Analiz için Görüntülenen Birincil Veri Küpü:

The Primary Data Cube Displayed for Interactive Analysis Using googleVis

GoogleVis kullanılarak görüntülenen bir olasılık tablosu (bir xtab işlev çağrısından)

enter image description here


14
2017-07-13 01:50



Doug, kulağa hoş geliyor. R ambalajı ile yardım etmeye çalışabilirim - ör. Python betikleri, diğer paketin kendi Perl'leri (xls dosyalarını okumak için bir Perl paketi kullanan cf gdata) veya Java kavanozları (birkaç paket) ile birlikte sunulmadığı bir sorun değildir. - Dirk Eddelbuettel
Bunu hiç yayınlamayı başardınız mı - katkıda bulunmak isterim - David Laing


Aslında mükemmel bir fikir. R de çok iyi tarih / saat yeteneklerine sahiptir, küme analizi yapabilir veya çeşitli makine öğrenimi alogorithmlerini kullanabilir, vb. Ayrıştırmak için üç farklı regexp motoru vardır.

Ve bu yeni bir fikir olmayabilir. Birkaç yıl önce, R'yi kullanan biriyle kısa e-postayla iletişim kuruyordum. proaktif (reaktif değil) logfile analizi: Günlükleri okuyun, (kendi durumlarında) zaman serisi modelleri oluşturun, sıcak noktaları tahmin edin. Bu çok açık bir fikir. Enerji laboratuarlarından biriydi ama artık bir URL’ye sahip değilim. Temporal kalıpların dışında bile var çok biri burada yapabilirdi.


9
2018-04-14 14:48



+1, deneyimli bir fikir kesinlikle burada yabancılaşmış bir kullanıcıya yardımcı olur. Sıradaki fikir o kadar da kötü değilse, satır tabanlı günlükleri ayrıştırmak ve farklı bir ips seçmek gibi en temel şeylerin zaten yapılmadığını merak ediyorum. - Matt Bannert
"Yapacak çok şey, çok az zaman." Yapılması gereken her şey de bitmez. Bu yüzden Açık Kaynak eğlenceli: Kaşın, senin projen. - Dirk Eddelbuettel
Tamam, beğenmeye başladım. Bu yüzden kaşınmanın durup durmadığını veya devam edip etmediğini görmek için okumaya başlamalıyım. - Matt Bannert


IIS Log dosyalarını yüklemek ve ayrıştırmak için R'yi kullanıyorum.

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
2018-04-25 15:00





Geçenlerde R kullanarak bir logfile analizi yaptım. Gerçekten açıklayıcı bir tablo değil, çoğunlukla açıklayıcı bir şeydi. Bu iş için R'nin yerleşik işlevleri yeterliydi.
Sorun, günlük dosyam yaklaşık 10 GB olduğu için veri depolama idi. Revolutions R, bu kadar büyük veriyi işlemek için yeni yöntemler sunuyor, fakat sonunda bir MySQL veritabanını bir arka uç olarak kullanmaya karar verdim (aslında normalizasyonda 2 GB'a küçültüldü).
Bu da, R'deki günlük dosyalarını okumada probleminizi çözebilir.


1
2018-04-15 07:06



Aslında RMySQL ile biraz çalıştım gibi ilginç geliyor. Ama görmediğim şey, günlük dosyalarını MySQL'e nasıl okumam gerektiği. Yukarıda tartıştığımız şey, en yaygın günlük dosya formatlarını (yerel olarak) analiz eden bir paket. Ancak, herhangi bir ressource, kickstart, link veya herhangi bir şekilde var mı? - Matt Bannert
Perl-script buldum İşte. Özel bir log dosyası formatı vardı, bu yüzden senaryoyu biraz değiştirdim. Çalışması gereken normal log dosyaları ile. - ahs85


#!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())

Demo çıkışı:

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, -

Bu format read.csv kullanılarak kolayca R'ye okunabilir. Ve herhangi bir 3. parti kütüphanesi gerektirmez.


1
2018-04-09 03:55