Logstash for SEO: come monitorare i Log del Web Server in realtime

Preview:

DESCRIPTION

Durante questo intervento verrà illustrato come si possono installare software di analisi in tempo reale dei log del server (ELK pattern: ElasticSearch, Logstash, Kibana) in modo da ottenere tutte le informazioni su Googlebot e per scoprire i punti di debolezza e gli eventi relativi ai nostri siti che non potremmo altrimenti conoscere.

Citation preview

SEOLogAlla scoperta

del "dato" perduto

@CardinaleAndrea#AdvSEOtool

Advanced SEO Tool - 20 Maggio 2014 - Bologna

Di cosa parlo● Log: chi, cosa e perché

● Log & Crawler

● Installazione sistema log management

● Panormica interfaccia web

L o g# introduzione

Log = Timestamp + Data

Ciclo di vita di un log

I’m not a SysAdmin

I’m a SEO !!!

L o g & S E O

# andiamo al sodo

OGGI

IERI ?

OGGI

IERI

HO GIÀ TUTTO

Ho già tutto

CRAWLER# questo strano coso

Caffeine

Crawl Rank (?)

Crawl Budget

www.sito1.it www.sito2.it www.sito3.it

CRAWLER & LOG

$ la strana coppia

HTTP status codes

200301302

404

500 503304 410

Quali “strade” percorre

Importanza dei contenutila pensiamo allo stesso modo?

Scoperta nuovi contenuti

Velocità erogazione risorse

Banda assorbita

ANALISI FAI DA TE

$ SEOroy Merlin

Complesso?Noioso?Lungo?

eppure c’è chi oggi lo fa

IL SEO SBORONE

# cut -f3,6 /var/log/httpd/access.log | grep -P "^GET /pagina.html" | grep "Googlebot" | wc -l

# cut -f1 /var/log/httpd/access.log | sort | uniq -c | sort -n | tail

IL SEO “DELEGANTE”SysAdmin, non ti crucciare:

Vuolsi così colà dove si puoteciò che si vuole, io sono SEO

ed a te devo demandare

IL SEO MITOLOGICO

metà Uomometà Excel

Problematiche

$ ‘na parola !!!

Formato non leggibile

Una marea di dati

Più server

Più clienti

Nessun accesso a serverReal TimeCentralizzatoAccettare formati differentiPerformanteScalabileRicerche sempliciAlerts

ideale

$ E = mc2

Soluzioni

COMMERCIALI

… i suoi “amici”

… e gli “amici degli amici”

… i suoi “amici”

$ nice to meet you

Logstash

● raccoglie, trasmette, interpreta, memorizza

● libero e open source

● scritta principalmente da Jordan Sissel

If a newbie has a bad time,it's a bug in Lotstash

$ how it works

Architettura

SHIPPER

STORAGE+

SEARCH

WEBINTERFACE

ANALYZER+

INDEXERSHIPPER

SHIPPER

BROKER

SHIPPER

STORAGE+

SEARCH

WEBINTERFACE

ANALYZER+

INDEXERSHIPPER

SHIPPER

BROKER

AGENT SERVER CENTRAL SERVER

logstash.miosito.itsitoesempio.it

$ il gioco si fa duro

Installazioni

Logstash$ Prerequisiti

# java -versionjava version "1.7.0_55"OpenJDK Runtime Environment (rhel-2.4.7.1.el6_5-x86_64 u55-b13)OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)

GIÀ INSTALLATO ?

# sudo yum install java-1.7.0-openjdk

INSTALLIAMO

Logstash$ Install

Agent & Central

# sudo vi /etc/yum.repos.d/logstash.repo

[logstash-1.4]name=logstash repository for 1.4.x packagesbaseurl=http://packages.elasticsearch.org/logstash/1.4/centosgpgcheck=1gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearchenabled=1

# sudo yum install logstash

Logstash

Logstash$ Install

Central only

# sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

# sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

# sudo yum --enablerepo=remi install redis

# sudo vi /etc/redis.conf

# commentiamo la seguente riga# bind: 127.0.0.1

# sudo vi /etc/yum.repos.d/elasticsearch.repo

[elasticsearch-1.1]name=Elasticsearch repository for 1.1.x packagesbaseurl=http://packages.elasticsearch.org/elasticsearch/1.1/centosgpgcheck=1gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearchenabled=1

# sudo yum install elasticsearch

# sudo vi /etc/elasticsearch/elasticsearch.yml

# aggiungamo le due seguenti righecluster.name: logstash_testnode.name: "elasticsearch_server1"

Logstash

$ Config

TRE SEZIONIinput {

}

filter {

}

output {

}

TRE SEZIONIinput {

}

filter {

}

output {

}

Da dove arrivano i log?

TRE SEZIONIinput {

}

filter {

}

output {

}

Da dove arrivano i log?

Qui li manipoliamo

TRE SEZIONIinput {

}

filter {

}

output {

}

Da dove arrivano i log?

Qui li manipoliamo

Che cosa ce ne facciamo?

Logstash$ Shipper Config

Input

collectd drupal_dblog elasticsearch eventlog

exec file ganglia gelf gemfire generator graphite heroku imap invalid_input irc jmx

log4j lumberjack pipe puppet_facter rabbitmq redis relp s3 snmptrap sqlite sqs stdin stomp

syslog tcp twitter udp unix varnishlog websocket wmi xmpp zenoss zeromq

input {

file {path => "/var/log/httpd/access-sitoesempio.log"type => "sitoesempio-apache-access"# e se si vuol partire da inizio file

start_position => "beginning"}

}

Logstash$ Shipper Config

Output

boundary circonus cloudwatch csv datadog datadog_metrics

elasticsearch elasticsearch_http elasticsearch_river email exec file ganglia gelf gemfire google_bigquery

google_cloud_storage graphite graphtastic hipchat http irc jira juggernaut librato loggly lumberjack metriccatcher

mongodb nagios nagios_nsca null opentsdb pagerduty pipe

rabbitmq redis riak riemann s3 sns solr_http sqs statsd stdout stomp syslog tcp udp websocket xmpp zabbix zeromq

output {

redis {host => "logstash.miosito.it"data_type => "list"key => "logstash"

}

}

Logstash$ Shipper Config

Filter

advisor alter anonymize checksum cidr cipher clone

collate csv date dns drop elapsed elasticsearch

environment extractnumbers fingerprint gelfify geoip

grep grok grokdiscovery i18n json json_encode kv

metaevent metrics multiline mutate noop prune punct railsparallelrequest range ruby sleep split sumnumbers

syslog_pri throttle translate unique urldecode useragent uuid wms wmts xml zeromq

filter {

grok {match => { "message" => "%{COMBINEDAPACHELOG}" }

}date {

match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]locale => "en"

}

}

Logstash$ Shipper Config

Grok Filter

+ di 120 patternshttps://github.com/elasticsearch/logstash/tree/master/patterns

in particolarehttps://github.com/elasticsearch/logstash/blob/master/patterns/grok-patterns

%{pattern:nome_campo}

Grok - %{COMBINEDAPACHELOG}

Campo Valore Campo Valoreclientip 99.222.33.44 ident -

auth - timestamp 04/Apr/2014:00:16:14 +0200

verb “GET” request "/robots.txt"

httpversion "1.1" response "200"

"bytes" "66" referrer ""-""

agent ""Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)""

99.222.33.44 - - [04/Apr/2014:00:16:14 +0200] "GET /robots.txt HTTP/1.1" 200 66 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Logstash$ Shipper Config

Final result

input {file {

path => "/var/log/httpd/access-sitoesempio.log"type => "sitoesempio-apache-access"

}}filter {

grok {match => { "message" => "%{COMBINEDAPACHELOG}" }

}date {

match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]locale => "en"

}}output {

redis {host => "logstash.miosito.it"data_type => "list"key => "logstash"

}}

# sudo vi /etc/logstash/conf.d/shipper.conf

Logstash$ Central Config

Input

collectd drupal_dblog elasticsearch eventlog exec file ganglia gelf gemfire generator

graphite heroku imap invalid_input irc jmx log4j lumberjack pipe puppet_facter rabbitmq

redis relp s3 snmptrap sqlite sqs stdin stomp syslog tcp twitter udp unix varnishlog

websocket wmi xmpp zenoss zeromq

input {

redis {host => "localhost"type => "redis"data_type => "list"key => "logstash"

}

}

Logstash$ Central Config

Output

boundary circonus cloudwatch csv datadog datadog_metrics

elasticsearch elasticsearch_http

elasticsearch_river email exec file ganglia gelf gemfire google_bigquery google_cloud_storage graphite graphtastic

hipchat http irc jira juggernaut librato loggly lumberjack metriccatcher mongodb nagios nagios_nsca null opentsdb

pagerduty pipe rabbitmq redis riak riemann s3 sns solr_http sqs statsd stdout stomp syslog tcp udp websocket

xmpp zabbix zeromq

output {

elasticsearch {cluster => "logstash_test"

}

}

output {elasticsearch {

cluster => "logstash_test"}

if [response] in ["500", "404"] and [ua_name] = “Googlebot” {email {

from => "a.cardinale@logstash.webandtech.it"subject => "Error %{response}"to => "a.cardinale80@gmail.com"via => "sendmail"body => "Error: %{message}"htmlbody => "<h2>Error %{response}</h2><div align='center'>%{message}</div>"

}}

}

Logstash$ Central Config

Filter

advisor alter anonymize checksum cidr cipher clone collate csv date dns drop elapsed elasticsearch

environment extractnumbers fingerprint gelfify geoip

grep grok grokdiscovery i18n json json_encode kv

metaevent metrics multiline mutate noop prune punct railsparallelrequest range ruby sleep split sumnumbers

syslog_pri throttle translate unique urldecode useragent uuid wms wmts xml zeromq

filter {

… tutto ciò che vi occorre ...

}

if [agent] != "-" and [agent] != "" {

useragent {source => "agent"prefix => "ua_"

}

}

Mi occorrono info su User Agent?

Mi occorrono info su User Agent?Campo Valore Valoreua_device Other Spider

ua_major 26 2

ua_minor 0 1

ua_name Firefox Googlebot

ua_os Ubuntu Other

ua_os_name Ubuntu Other

if [clientip] {

geoip {source => "clientip"target => "geoip"

}

}

Mi occorrono info su Geolocalizzazione?

Campo Valore Campo Valoregeoip.continent_code EU geoip.ip 52.11.66.144

geoip.coordinates 9,51 geoip.latitude 51

geoip.country_code2 DE geoip.location 9,51

geoip.country_code3 DEU geoip.longitude 9

geoip.country_name Germany geoip.timezone Europe/Berlin

Mi occorrono info su Geolocalizzazione?

mutate {

convert => [ "bytes", "integer" ]convert => [ "[geoip][longitude]", "float" ]convert => [ "[geoip][latitude]", "float" ]

}

Devo convertire un campo?

if [request] =~ /\/.*?\.(jpg|gif|png)/ {

mutate {add_field => [ "file_type", "image" ]

}

}

Devo aggiungere un campo?

mutate {remove_field => [ "nomecampoinutile1", "nomecampoinutile2" ]

}

Devo rimuovere un campo?

if [referrer] =~ /^http(s?)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/ {

grok {match => [

"referrer", "%{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST:referrer_host})?(?:%{URIPATHPARAM})?"

]}

}

Devo estrapolare un campo?

kv {

source => "request"field_split => "&?"include_keys => [ "page", "q" ]prefix => “qs_”

}

Mi occorrono alcuni parametri QueryString?

Logstash$ Server Config

Final result

input {redis {

host => "localhost"type => "redis"data_type => "list"key => "logstash"

}}

filter {………………………………………….………………………………………….………………………………………….

}

output {

elasticsearch {cluster => "logstash_test"

}

}

# sudo vi /etc/logstash/conf.d/central.conf

Logstash$ Start

# sudo chkconfig redis on

# sudo service redis start

# sudo chkconfig elasticsearch on

# sudo service elasticsearch start

# sudo chkconfig logstash on

# sudo service logstash start

$ guardiamolo in faccia

Interfaccia web

# sudo /opt/logstash/bin/logstash web

Integrato con Logstash

http://logstash.miosito.it:9292

Kibana$ Screenshot

imposto le queriesin questo esempio:

gli http status code che mi interessanoimposto i filtri

in questo esempio: solo le richieste

effettuate dagli Spiders

Per ogni query posso assegnare

un alias ed un colore

Histogram Panel

Posso impostare il tipo di grafico e l’intervallo temporale

Grafico a Torta Grafico a barre

Trends

posso visualizzare i trends su base personalizzabile

(1 giorno, 7 giorni, mensile, etc…)

Table Panel

Visualizzo gli eventi in tabella

Posso selezionare i campi da visualizzare

Posso aggiungere nuove righeed ordinarle

Posso aggiungere nuovi panels e successivamente spostarli

con drag and drop

Ogni panel ha diverse opzioni di configurazione

che variano in base al tipo di panel

Per ogni panel posso scegliere su quali queries deve “lavorare”

$ ...

Tips and Tricks

Googlebot è davvero Googlebot ?

Il log di Apache è

fatto cosi:

Possiamo “costruirlo” a nostro piacimento

Ti occorre la velocità di erogazione di una richiesta?

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" %D" supercombined

LinksLogstash Sitehttp://www.logstash.net/

The Logstash cookbookhttp://cookbook.logstash.net/

Logstash source code on on GitHubhttps://github.com/elasticsearch/logstash/

Grok debuggerhttp://grokdebug.herokuapp.com/

Regular expressionshttp://regexpal.com/ - http://www.regexr.com/ - http://regexone.com/

Apache - Custom Log Formatshttp://httpd.apache.org/docs/2.2/mod/mod_log_config.html

Matt Cutts Interviewed by Eric Engehttp://www.stonetemple.com/articles/interview-matt-cutts-012510.shtml

Our new search index: Caffeinehttp://googleblog.blogspot.it/2010/06/our-new-search-index-caffeine.html

Large-scale Incremental Processing Using Distributed Transactions and Notificationshttp://research.google.com/pubs/pub36726.html

Imageshttps://www.flickr.com/photos/carbonnyc/6415460111 https://www.flickr.com/photos/carbonnyc/5757504378

https://www.flickr.com/photos/giuseppesavo/6153578409 https://www.flickr.com/photos/sybrenstuvel/2468506922

https://www.flickr.com/photos/bortescristian/8442828274 https://www.flickr.com/photos/ajari/3921502672

https://www.flickr.com/photos/76657755 https://www.flickr.com/photos/marcobellucci/3534516458

http://it.wikipedia.org/wiki/Nana_bianca https://www.flickr.com/photos/walkingsf/5912385701

http://belladavendere.blogspot.it/2012/12/maria-cristina-franco-next-big-thing.html https://www.flickr.com/photos/liquene/3949414617

https://www.flickr.com/photos/dandechiaro/4151566643 https://www.flickr.com/photos/schroedinger/105285724

https://www.flickr.com/photos/peddhapati/11671457605 https://www.flickr.com/photos/fdecomite/2552413544

https://www.flickr.com/photos/luchilu/495547910 http://en.wikipedia.org/wiki/File:Perkulator2.jpg

https://www.flickr.com/photos/86979666@N00/7623744452

Recommended