리눅스시스템/보안 2014/05/21 15:58
Logstash, ElasticSearch, Kibana 이것들은 무엇인가?
- Logstash
각종 로그를 가져와 보기 좋은 형태로 만들어 줍니다.
- ElasticSearch
Lucene 바탕으로 개발한 분산 검색엔진입니다.
- Kibana
ElasticSearch의 저장 된 데이터를 사용자에게 보기 좋게 웹으로 보여줍니다.
실시간 로그 분석 시스템의 구성도는 어떻게 되는가?
Logstash에서 1.2.2 기준으로 추천하는 구성도 입니다.
이전 버전에서는 Redis 대신 RabbitMQ를 사용했었는데 복잡성 때문에 Redis를 사용하기 시작 했다고 합니다.
Redis를 사용하는 이유는 Logstash에서 가져온 데이터를 디스크 I/O를 거치지 않고 Memory로 처리 하도록 사용됩니다.
실시간 로그 분석 시스템을 실제로 만들어 보자.
본 글은 CentOS 6.4(x86_64)에서 테스트 되었고 난이도는 하급 정도가 되겠으며 테스트 용도로 구축한 것이기 때문에 한 서버에 모든 프로그램이 동작하게 됩니다.
그러므로 테스트 환경에서는 2~4GB 정도의 서버 메모리가 필요하며, 실서버에 적용시 각각의 프로그램 용도에 맞게 분산해서 구축 하셔야 합니다.
설치 순서는 Nginx -> Redis -> JDK -> ElasticSearch -> Logstash -> Kibana 가 되겠습니다.
1. Nginx 설치
Nginx의 저장소 추가하여 설치를 진행합니다.
[root@ruo91 ~]# nano /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=0
[root@ruo91 ~]# yum --enablerepo=nginx install -y nginx
- nginx.conf 설정
Access 로그가 JSON 포멧 방식으로 저장 되도록 설정합니다.
[root@ruo91 ~]# nano /etc/nginx/nginx.conf
user nginx;
access_log off;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# JSON
log_format json_format '{ "@time": "$time_iso8601", '
'"@fields": { '
'"country": "$http_cf_ipcountry", '
'"ip": "$remote_addr", '
'"status": "$status", '
'"request": "$request", '
'"size": "$body_bytes_sent", '
'"user-agent": "$http_user_agent", '
'"referrer": "$http_referer" } }';
# yongbok.net
server {
listen 80;
server_name yongbok.net www.yongbok.net;
root /home/ruo91/public_html;
index index.html;
# Logs
access_log /storage/logs/www-access.json json_format;
error_log /storage/logs/www-error.log;
}
}
JSON 포멧의 Access 로그는 아래와 같이 저장이 됩니다.
{
"@time": "2013-11-03T15:12:57+09:00",
"@fields":
{
"country": "US",
"ip": "66.249.73.31",
"status": "200",
"request": "GET /blog/page/25/ HTTP/1.1",
"size": "16253",
"user-agent": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
"referrer": "-"
}
}
2. Redis 설치
[root@ruo91 ~]# yum install -y redis
- Redis 실행
[root@ruo91 ~]# service redis start
3. JDK 설치
JDK (Java Development Kit)을 적절한 곳에 설치 합니다.
http://www.oracle.com/technetwork/java/javase/downloads/index.html
[root@ruo91 ~]# tar xzvf jdk-7u45-linux-x64.tar.gz
[root@ruo91 ~]# mv jdk-7u45 /usr/local/jdk
[root@ruo91 ~]# nano ~/.bash_profile
# JDK
export JAVA_HOME=/usr/local/jdk
export JDK_HOME=$JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
[root@ruo91 ~]# source ~/.bash_profile
4. ElasticSearch 설치
http://www.elasticsearch.org/
[root@ruo91 ~]# mkdir /opt/dev
[root@ruo91 ~]# cd /opt/dev
[root@ruo91 ~]# wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.5.tar.gz
[root@ruo91 ~]# tar xzvf elasticsearch-0.90.5.tar.gz
[root@ruo91 ~]# cd elasticsearch-0.90.5
ElasticSearch의 모니터링을 위한 필수 Plugin 설치 (head, bigdesk)
[root@ruo91 ~]# bin/plugin -install mobz/elasticsearch-head
[root@ruo91 ~]# bin/plugin -install lukas-vlcek/bigdesk
- ElasticSearch 실행
[root@ruo91 ~]# screen -S ElasticSearch
[root@ruo91 ~]# /opt/dev/elasticsearch-0.90.5/bin/elasticsearch -f
[2013-11-04 20:59:46,452][INFO ][node ] [Franz Kafka] version[0.90.5], pid[20250], build[c8714e8/2013-09-17T12:50:20Z]
[2013-11-04 20:59:46,453][INFO ][node ] [Franz Kafka] initializing ...
[2013-11-04 20:59:46,458][INFO ][plugins ] [Franz Kafka] loaded [], sites [bigdesk, head]
[2013-11-04 20:59:48,401][INFO ][node ] [Franz Kafka] initialized
[2013-11-04 20:59:48,401][INFO ][node ] [Franz Kafka] starting ...
[2013-11-04 20:59:48,474][INFO ][transport ] [Franz Kafka] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/127.0.0.1:9300]}
[2013-11-04 20:59:51,549][INFO ][cluster.service ] [Franz Kafka] new_master [Franz Kafka][xtRk5GxmRPODRcrlbdYK7A][inet[/127.0.0.1:9300]]{master=true}, reason: zen-disco-join (elected_as_master)
[2013-11-04 20:59:51,578][INFO ][discovery ] [Franz Kafka] elasticsearch/xtRk5GxmRPODRcrlbdYK7A
[2013-11-04 20:59:51,590][INFO ][http ] [Franz Kafka] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/127.0.0.1:9200]}
[2013-11-04 20:59:51,590][INFO ][node ] [Franz Kafka] started
[2013-11-04 20:59:52,107][INFO ][gateway ] [Franz Kafka] recovered [2] indices into cluster_state
Ctrl + A + D를 눌러 screen 을 빠져 나옵니다. 진행 상황을 보려면 screen -r 로 언제든지 복귀 할수 있습니다.
5. Logstash 설치
http://logstash.net/
[root@ruo91 ~]# wget -P /opt/dev https://download.elasticsearch.org/logstash/logstash/logstash-1.2.2-flatjar.jar
- Logstash log shipper 설정 파일
가져올 로그를 지정하고 Redis로 데이터 저장
[root@ruo91 ~]# nano /opt/dev/logstash-shipper.conf
input {
file {
path => "/storage/logs/www-access.json" # JSON 포멧 방식의 Access log
type => nginx
format => json_event
}
}
output {
stdout { debug => true }
redis {
host => "127.0.0.1"
data_type => "list"
key => "logstash" # Redis에 저장시 사용할 Key 이름
}
}
- Logstash 실행
screen 명령어로 Logstash를 실행
[root@ruo91 ~]# screen -S logstash-shipper
[root@ruo91 ~]# java -jar /opt/dev/logstash-1.2.2-flatjar.jar agent -f /opt/dev/logstash-shipper.conf
{
"host" => "yongbok.net",
"path" => "/storage/logs/www-access.json",
"country" => "US",
"ip" => "66.249.73.95",
"status" => "404",
"request" => "GET /blog/page/110/?/entry/cannot-restore-segment-prot-after-reloc-Permission-denied&paged=107 HTTP/1.1",
"size" => "12681",
"user-agent" => "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
"referrer" => "-",
"@timestamp" => "2013-11-04T11:37:11.202Z",
"@version" => "1",
"type" => "nginx"
}
위와 같이 로그를 가져옴과 동시에 Redis로 저장이 됩니다. Ctrl + A + D를 눌러 screen 을 빠져 나옵니다.
진행 상황을 보려면 screen -r 로 언제든지 복귀 할수 있습니다.
- Logstash Indexer 설정 파일
Redis에 저장 된 데이터를 ElastaicSearch로 전송
[root@ruo91 ~]# nano /opt/dev/logstash-indexer.conf
input {
redis {
# redis 설정 값은 logstash-shipper.conf 설정과 동일 해야 합니다.
host => "127.0.0.1"
data_type => "list"
key => "logstash"
# json event를 Redis에서 가져오기 위해 json 코덱을 사용합니다.
codec => json
}
}
output {
stdout { debug => true debug_format => "json"}
elasticsearch { host => "127.0.0.1" }
}
- Logstash Indexer 실행
[root@ruo91 ~]# screen -S logstash-indexer
[root@ruo91 ~]# java -jar /opt/dev/logstash-1.2.2-flatjar.jar agent -f /opt/dev/logstash-indexer.conf
이제 Indexer가 Redis에 저장 된 데이터를 읽어와서 ElasticSearch로 저장합니다.
Ctrl + A + D를 눌러 screen 을 빠져 나옵니다.
진행 상황을 보려면 screen -r 로 언제든지 복귀 할수 있습니다.
ElasticSearch의 head 플러그인을 통해 logstash index가 생성 되어 데이터가 들어가 있는지 확인 해봅니다.
5. Kibana 설치
Kibana는 Logstash를 web으로 구동했을때와 ElasticSearch의 Plugin으로 설치 했을때 모두 사용이 가능합니다.
Nginx 웹서버를 이미 사용중이므로 가상호스트 사용자의 public_html 디렉토리에 바로 넣어 설치 하겠습니다.
[root@ruo91 ~]# git clone https://github.com/elasticsearch/kibana.git
[root@ruo91 ~]# mv kibana/src /home/ruo91/public_html/kibana
[root@ruo91 ~]# chown -R ruo91:ruo91 /home/ruo91/public_html/kibana
- Kibana 설정
config.js에서 ElasticSearch의 서버 아이피와 kibana_index를 수정합니다.
kibana_index는 logstash-indexer가 index를 logstash-2013.11.04 형태로 생성 하므로 와일드 카드로 주면 날짜와 상관 없이 불러 올수 있습니다.
[root@ruo91 ~]# su - ruo91
[ruo91@ruo91 ~]$ nano public_html/kibana/config.js
/**
* These is the app's configuration, If you need to configure
* the default dashboard, please see dashboards/default
*/
define(['settings'],
function (Settings) {
return new Settings({
/**
* URL to your elasticsearch server. You almost certainly don't
* want 'http://localhost:9200' here. Even if Kibana and ES are on
* the same host
*
* By default this will attempt to reach ES at the same host you have
* elasticsearch installed on. You probably want to set it to the FQDN of your
* elasticsearch host
* @type {String}
*/
/* elasticsearch: "http://"+window.location.hostname+":9200", */
elasticsearch: "http://localhost:9200",
/**
* The default ES index to use for storing Kibana specific object
* such as stored dashboards
* @type {String}
*/
kibana_index: "logstash-*",
/**
* Panel modules available. Panels will only be loaded when they are defined in the
* dashboard, but this list is used in the "add panel" interface.
* @type {Array}
*/
panel_names: [
'histogram',
'map',
'pie',
'table',
'filtering',
'timepicker',
'text',
'fields',
'hits',
'dashcontrol',
'column',
'derivequeries',
'trends',
'bettermap',
'query',
'terms',
'sparklines'
]
});
});
- Kibana 웹으로 확인
http://your-domain.com/kibana/ 에 접속해서 실시간으로 로그를 분석할수 있게 됩니다.
감사합니다. :D
http://zosel.net/trackback/127
from.canada goose enfant 2014/11/28 11:55
avec la chanson, parce que sa en vain pour que vous me disiez ce que vous êtes et la bonne société strangerscharmsattractions, vous l'esprit, qui devrait vous donner confiance en yourselfis, que vous avez fait il. Mme Snagsby air plutôt inquiet, a cédé...
from.chanel homme sport 2014/11/28 20:54
lui font écho, quand il était à l'audience Seigneur commandants. Sam avait pensé à la mendicité pour quelque chose de plus nourrissant pour les hommes blessés au moins, mais il n'a pas eu le courage. Crasters yeux étaient froids et moyenne, et chaque f...
from.montre gucci pour homme prix 2014/11/28 21:59
pauvre main à la lecture de quoi que ce soit mais imprimer les nouvelles importantes suivantes: Old Anchor Inn, Bristol, Mars 1, 17 Cher Livesey Comme je ne sais pas si vous êtes dans le hall ou encore à Londres, j'envoie ce dans le double à deux endro...
from.negozio gucci a napoli 2014/11/28 22:02
. Era solo 365 anni di età, ma che da tempo era l'albero come lo stesso numero di giorni potrebbe essere per noi; Ci svegliamo di giorno e dormire di notte, e poi abbiamo i nostri sogni. E 'diverso con l'albero; essa è obbligata a tenere svegli per tre...
from.canada goose pas cher 2014/11/29 04:29
de son propre, qui, uni à son joli visage et la silhouette, était exceptionnellement agréable. Elle lui déjà relevé de beaucoup de l'instruction de ces jeunes, et il intervenait rarement sauf à marcher sa part dans le chiffre si il avait quelque chose...
from.canada goose enfant 2014/11/29 09:10
prévu, et à sa trop tard maintenant, et ainsi de suite. «Avez-vous, Papa Meagles? dit Mme Gowan. «Je ne suis pas surpris. «Eh bien, maam, motivée M. Meagles, je suis dans l'espoir que vous auriez pu au moins surpris, parce que me faire du mal volontair...
from.canada goose enfant 2014/11/29 14:27
confusion quand elle l'a proposé. Cependant, je l'ai dit, Caddy, je suis sûr que vous êtes les bienvenus pour apprendre tout ce que vous pouvez apprendre de moi, mon cher, et je lui ai montré tous mes livres et méthodes et toutes mes voies agités. Vous...
from.tutoriel maquillage chanel 2014/11/29 17:03
accroché avant. Janos Slynt est le mauvais homme, Père. Mer faire mieux avec le commandant de la Tour Ombre. Ou Eastwatch-by-the-Sea. Le commandant de la Tour Shadow est un Mallister de Salvemer. Eastwatch est détenu par un ironman. Ni servirait ses de...
from.doudoune canada goose femme 2014/11/29 17:23
l'histoire. Je l'espère Lady Dedlock excusera son caractère douloureux. Il existe différentes opinions sur le fond, plus ou moins contradictoires avec Volumnias. Ce jeune belle créature ne peut pas croire qu'il a jamais été une telle dame et rejette to...
from.blouson canada goose 2014/11/29 23:13
sans mon vieux visage très bien. Je suis actuellement assez avancé pour être en mesure de s'asseoir dans un grand fauteuil et même étourdiment à marcher dans la pièce voisine, se penchant sur Charley. Le miroir avait disparu de son lieu habituel dans c...
from.canada goose prix 2014/11/30 06:38
sont d'avoir un de nous précipiter sur des verres d'eau froide, comme un subalterne! Pourquoi, un policier, a dit Mlle Fanny, si un mendiant avait une crise dans la rue, mais pourrait aller plonger sur des gobelets, comme cette très Amy a fait dans cet...
from.doudoune canada goose femme 2014/12/01 16:57
venir, je viens! et glissé en avant par une certaine façon souterraine qui émettait une odeur cellarous. «Et si, Amy, a déclaré sa soeur, quand les trois ensemble adopté par la porte qui avait une telle conscience honteuse d'être différent des autres p...
from.chanel vitalumiere poudre 2014/12/01 16:58
avait eu la même les cheveux fins, il semblait rappeler. Dites-lui que quand vous le voyez, milord, car il ... comme il se il vous plaît vous. Dites-lui qu'elle est belle. Je vais, Ned lui avais promis. Ce fut sa malédiction. Robert jurerait amour éter...
from.foulard gucci prezzi 2014/12/01 16:59
, rispose Wi. Qualora il produttore delle leggi essere anche l'interruttore delle leggi? Perché no? ha detto Aaka, ridendo, vedendo che chi fa può anche rompersi. Inoltre, chi troverà colpa con l'uomo che con una mano sola poteva uccidere il toro dei t...
from.バーバリー アウトレット 2015/11/10 06:27
One additional technique in favor of promoting your blog ::: ZOSEL ::: :: Logstash ElasticSearch Kibana를 이용한 실시간 로그 분석 is posting comments on different directories with your website link.
from.bottes ugg pas cher 2015/11/12 00:39
avertissement; pour M. Lheureux les accompagnait, et a parlé de temps en temps, comme pour entrer dans la conversation. Voici une journée superbe! Tout le monde est sorti! Le vent est à l'est! Et ni Madame Bovary ni Rodolphe lui répondit, tout au moind...
from.アップルウォッチ エルメス 2015/11/12 03:57
それ目覚ましい ウェブページウェブサイト ::: ZOSEL ::: :: Logstash ElasticSearch Kibana를 이용한 실시간 로그 분석 便利を支援するために私の経験ノウハウ。 adminのおかげ
from.ugg ブーツ アウトレット 2015/11/12 04:35
場合どんなに彼のためにいくつかのいずれかを検索必要事 ::: ZOSEL ::: :: Logstash ElasticSearch Kibana를 이용한 실시간 로그 분석 、こうして彼/彼女ニーズへその事がこっちに維持されている詳細に、こうして、したがってそうことを利用できる。
from.doudoune canada goose 2015/11/12 11:13
en à un taxi, qui lui a transmis à son bureau, et il rentra chez lui de la même façon à six. Quelque chose de la force de caractère de l'homme verra si nous nous souvenons comment il était sensible à l'opinion des voisins: cet homme dont chaque mouveme...
from.オークリー サングラス 2015/11/13 02:47
What's up, how's it going? Just shared this ::: ZOSEL ::: :: Logstash ElasticSearch Kibana를 이용한 실시간 로그 분석 with a colleague, we had a good laugh.
from.golden goose outlet 2015/11/13 23:07
possibilità di tale buon fortune.Colonel Montagu li trovate qui, circa quarant'anni fa; e afterhim, il signor Alder, nel 1845. Ho trovato centinaia di loro, ma solo una volta, in1854 dopo una tempesta sud-orientale pesante, lavato tra il greatLutraria...
from.ladies canada goose jacket 2015/11/17 13:17
A reduction in the inferno of accomplice to this world. Also solved my one mind. Or you can continue to implement the original plan, if you really can create miracles, enough to win over the powerful forces. Maybe I'll change my mind, the magic seed fo...
from.moncler herre jakke 2015/11/20 13:20
Jeg ved, hvor mange ikke, og selv Rademacher taler stor, jeg tror ikke han gør, enten. De udgangsforbud tilbage i kraft - Åh ja. Udgangsforbud. Ben blev gnide den side af halsen langsomt og bevidst. Der gjorde underværker tilbage i 58. Jeg kan huske så...
from.moncler jakker til mand 2015/11/27 21:56
en ranglet fyr klædt i jeans og chambray, ville begynde upchucking. Men da First service kom, den høje mand beordrede intet mere end et glas club soda, lige så høflig, som man kan ønske sig. Hans tjeneste lys er ikke gået på, og den gryderet glemmer al...
from.fifa 16 coins 2015/11/28 06:59
I purchased this breadmaker this kind of set of two to restore the pair decided to buy when it comes to 3 years ago....yes !, some people live through who rather long! I take fifa 16 coins all of wintertime as well as adore fifa 16 coins. First, thes...
from.Price Of Mcm Backpack 2016/02/08 14:17
where can i get cheap nike air max
from.rob havenstein jersey 2016/02/20 15:02
Thanks designed for sharing such a nice idea, piece of writing ::: ZOSEL ::: :: Logstash ElasticSearch Kibana를 이용한 실시간 로그 분석 is nice, thats why i have read it fully
from.Ugg Italia Online Recensioni 2016/02/25 18:21
nike air max jordans
from.Oakley Sunglasses Discount Sale 2016/03/01 02:41
nike id hyperdunk
from.Cheap Oakley Sunglasses Sale 2016/03/01 02:49
where to buy nike air max
from.Oakley Military Discount Uk 2016/03/05 09:43
http://lesnaja-poljana.ru/wp-content/oakley-thump-pro/Oakley-Officer-Discount-xehuwb.htmlOakley Officer Discount
from.Oakley Sunglasses Clearance 2016/03/05 09:49
air max nike shoes for women
from.Oakley Radarlock Sunglasses For Sale 2016/03/07 07:03
nike outlet waterloo
from.Oakley Eyewear Outlet Uk 2016/03/07 20:30
http://lesnaja-poljana.ru/wp-content/oakley-thump-pro/Oakley-Discount-For-Law-Enforcement-wnbmxs.htmlOakley Discount For Law Enforcement
from.Where Can I Find Oakley Sunglasses 2016/03/07 20:38
nike air max penny 1
from.Oakley Outlet El Paso 2016/03/11 14:17
womens nike free 5.0 running shoes
from.Cheap Oakley Half Jacket 2016/03/12 20:34
http://blog.koozyt.com/wp-includes/images/media/oakley-sunglasses/Cheap-Oakley-Necessity-sjsclf.htmlCheap Oakley Necessity
from.nike air max 2016/03/16 00:58
::: ZOSEL ::: :: Logstash ElasticSearch Kibana를 이용한 실시간 로그 분석,nike air max
from.cheap shop by face 2016/03/27 05:01
Its my destiny to pay a visit at this website ::: ZOSEL ::: :: Logstash ElasticSearch Kibana를 이용한 실시간 로그 분석 and find out my required piece of writing along with video presentation, that YouTube video and its also in quality.
from.fake a&f mens polo strip short tees 2016/03/29 23:56
What's up Jackson, if you are a new net user afterward you have to go to see daily this web page and read the updated ::: ZOSEL ::: :: Logstash ElasticSearch Kibana를 이용한 실시간 로그 분석 at at this place.
from.read more 2016/09/01 10:42
For many who prefer to have a handy for the beat worldwide of fashion in addition to accessories, this title Eddie Borgo will likely have got a well known band to it. Eddie Borgo started off his eponymous company within 2007 for an American-based delux...
from.golden goose rimini 2016/11/30 23:37
di nuovo nella sua place.We sono ora, ha detto Arianna, nel famoso labirinto che Daedalusbuilt prima si è fatto un paio di ali, e volò via da ourisland come un uccello. Che Dedalo era un operaio molto furbo; ma di allhis congegni abile, questo labirin...
from.::: ZOSEL ::: :: Logstash + ElasticSearch + Kibana를 ì´ìš©í•œ 실시간 로그 ë¶„ì„ 2017/01/05 14:17
I found a great...
from.porter carre hermes 2017/05/09 11:23
qui Abamnon fait notALEXANDRIA ET SA SCHOOLS66unconsciously justifient. Et pourtant, il perd rapidement de vue les germes humains realeternal de la vérité autour de laquelle ces superstitions regroupées, et est vraiment plus loin de la vérité et de la...
from.Shower Curtain Hollaween 2017/09/22 20:20
Polyester If you want to order in bulk, please feel free to contact us. WE ARE CAPABLE OF MAKING BIG NUMBERS OF PRODUCTS; SIZE: 60 "X 72". MATERIAL: 100% Brand New and High Quality (100% polyester). YOU WILL GET : 1 shower curtain,Not Included Rod , 12...
from.mini bag miu miu 2017/10/07 18:51
L'angolo ha posto la lettera che stava cominciando sul mucchio sulle sue cavalle e non leggeva più. I grandi tronchi geniali erano incandescenti, brucianti; Dal più fresco le fiamme scorrevano e forgiarono; Lungo la superficie manufatta degli altri co...
from.golden goose ball star uomo 2017/10/12 13:27
scarpe golden goose uomo amazon scarpe golden goose uomo amazon come pulire scarpe golden goose scarpe tennis golden goose golden goose mantova golden goose sneakers website vendita scarpe golden goose milano golden goose shop golden goose deluxe brand...
from.borse valentino prezzi 2017/11/24 02:05
Di filo spinato, utilizzato per fornire un ulteriore livello di protezione fisica ai proprietari di proprietà che dispongono di una protezione legale. Ma, a differenza del filo spinato, possono anche controllare ciò che facciamo una volta che abbiamo ...
from.campaign burberry 2018/04/04 00:41
Francisco, osservando la folla di persone e macchine sotto di me. Adoro San Francisco, ed 猫 stato fantastico vederlo da quella prospettiva. Quando sono arrivato all'indirizzo di Gary Prescott, sono rimasto sorpreso nel vedere che la sua casa era grande...
138