{"id":1059,"date":"2014-12-22T18:28:17","date_gmt":"2014-12-22T21:28:17","guid":{"rendered":"http:\/\/www.maurom.com\/blog\/?p=1059"},"modified":"2014-12-27T17:55:27","modified_gmt":"2014-12-27T20:55:27","slug":"analizando-logs-en-5-minutos-con-elk","status":"publish","type":"post","link":"https:\/\/maurom.com\/blog\/2014\/12\/22\/analizando-logs-en-5-minutos-con-elk\/","title":{"rendered":"Analizando logs en 5 minutos con ELK"},"content":{"rendered":"<p>A partir de una idea de Santiago, y tomando como base algunos componentes que los muchachos de <a href=\"http:\/\/www.slidesearch.org\/slide\/eko10-security-monitoring-for-big-infrastructures-without-a-million-dollar-budget-juan-berner-hernan-costante\">MercadoLibre utilizan para su infraestructura de gesti\u00f3n de logs<\/a>, se me ocurri\u00f3 hacer una prueba de concepto de a lo que es posible arribar r\u00e1pidamente utilizando la tr\u00edada <strong>ElasticSearch + Logstash + Kibana<\/strong>, m\u00e1s conocida com <a href=\"http:\/\/www.elasticsearch.org\/overview\/\"><strong>ELK<\/strong><\/a>.<\/p>\n<p>Para dar una m\u00ednima introducci\u00f3n, diremos que <a href=\"http:\/\/www.elasticsearch.org\/overview\/elasticsearch\">ElasticSearch<\/a> es un motor de b\u00fasqueda RESTful basado en el archiconocido Lucene, <a href=\"http:\/\/www.elasticsearch.org\/overview\/logstash\">Logstash<\/a> es una especie de concentrador\/manipulador\/estandarizador de logs provenientes de m\u00faltiples fuentes, y <a href=\"http:\/\/www.elasticsearch.org\/overview\/kibana\">Kibana<\/a>\u00a0es un visualizador de eventos que corre enteramente en el navegador. Los tres son componentes que pueden utilizarse en forma separada, pero en conjunto aplican precisamente esto de que <em>el todo es m\u00e1s que la suma de las partes<\/em>. De hecho yo hab\u00eda estado viendo Logstash aparte para una charla sobre logging que diera algunos a\u00f1os atr\u00e1s, cuando a\u00fan era un proyecto incipiente, y ahora me encuentro con que es un proyecto ampliamente utilizado en un mont\u00f3n de lados.<\/p>\n<p>Pero hoy no quiero detenerme demasiado en la teor\u00eda; la idea de este post es analizar registros yendo de 0 a 100 en 5 minutos (o lo que tarde en bajar cada aplicaci\u00f3n) y para ello nada mejor que arrancar ahora. As\u00ed que&#8230;<\/p>\n<h2>Analizando logs en 5 minutos con ELK<\/h2>\n<h3>Prerrequisitos<\/h3>\n<p>Como prerequisito es necesario el motor de ejecuci\u00f3n java 1.6 o 1.7. En distribuciones basadas en debian alcanza con instalar <code>openjdk-6-jre<\/code> u <code>openjdk-7-jre<\/code>. O eso creo, a lo mejor es necesario el jdk tambi\u00e9n; prueben por las dudas. El resto de los pasos se pueden hacer sin necesidad de ser root, como usuario com\u00fan.<\/p>\n<h3>Paso 0. Ubicarnos en un directorio limpio<\/h3>\n<pre>mkdir elk\r\ncd elk<\/pre>\n<h3>Paso 1. Obtener logstash<\/h3>\n<pre>wget -c <a href=\"https:\/\/download.elasticsearch.org\/logstash\/logstash\/logstash-1.4.2.tar.gz\">https:\/\/download.elasticsearch.org\/logstash\/logstash\/logstash-1.4.2.tar.gz<\/a>\r\ntar zxf logstash-1.4.2.tar.gz<\/pre>\n<h3>Paso 2. Obtener elasticsearch<\/h3>\n<pre>wget -c <a href=\"https:\/\/download.elasticsearch.org\/elasticsearch\/elasticsearch\/elasticsearch-1.1.1.tar.gz\">https:\/\/download.elasticsearch.org\/elasticsearch\/elasticsearch\/elasticsearch-1.1.1.tar.gz<\/a>\r\ntar zxf elasticsearch-1.1.1.tar.gz<\/pre>\n<h3>Paso 3. Obtener un log de apache<\/h3>\n<p>&#8230; de alg\u00fan lado. Si tienen un apache a mano, c\u00f3piense el archivo\u00a0al directorio actual y d\u00e9nle permisos de lectura para su usuario<\/p>\n<pre>cp \/var\/log\/apache2\/access.log access.log\r\nchmod go+r access.log<\/pre>\n<p>O si no tienen ninguno a mano, <a href=\"http:\/\/maurom.com\/files\/access.elk.log\">ac\u00e1 les dejo\u00a0uno<\/a> que es un fragmento del log de este mismo sitio. Ustedes pueden hacer lo que les plazca con \u00e9l, total este es un blog personal. Si quieren optar por otra alternativa, <a href=\"https:\/\/www.google.com.ar\/search?q=&quot;index+of+%2F&quot;+access.log\">google hacking es su amigo<\/a> y yo no se los recomend\u00e9.<\/p>\n<pre>wget -c <a href=\"http:\/\/maurom.com\/files\/access.elk.log\">http:\/\/maurom.com\/files\/access.elk.log<\/a> -O access.log<\/pre>\n<h3>Paso 4. Iniciar elasticsearch<\/h3>\n<pre>echo Iniciando Elasticsearch. Aguarde 15s ...\r\nelasticsearch-1.1.1\/bin\/elasticsearch &amp;\r\nsleep 15<\/pre>\n<h3>Paso 5. Crear un archivo de configuraci\u00f3n para parsear logs de apache<\/h3>\n<p>Para ello, creen un archivo de texto llamado <code>logstash-apache.conf<\/code> en el directorio actual y copien y peguen el siguiente bloque. Luego editen la ruta al archivo de logs, indic\u00e1ndola en forma absoluta, y configuren el tipo de entradas de log y el lenguaje de los meses seg\u00fan corresponda (sino tira unos errores horribles).<\/p>\n<pre>input {\r\n  file {\r\n    # apuntar a donde haga falta, con ruta absoluta!\r\n    path =&gt; \"<strong>\/home\/usuario\/elk\/access.log<\/strong>\"\r\n    # desde donde leer el log (\"end\" para tomar datos en vivo)\r\n    start_position =&gt; beginning\r\n  }\r\n}\r\nfilter {\r\n  if [path] =~ \"access\" {\r\n    mutate { replace =&gt; { \"type\" =&gt; \"apache_access\" } }\r\n    grok {\r\n      # depende del formato de archivo\r\n      match =&gt; { \"message\" =&gt; \"%{COMBINEDAPACHELOG}\" }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 # match =&gt; { \"message\" =&gt; \"%{COMMONAPACHELOG}\" }\r\n    }\r\n\u00a0\u00a0\u00a0 kv {\r\n      # con esto parsea incluso querystrings\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 source =&gt; \"request\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 target =&gt; \"params\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 field_split =&gt; \"?&amp;\"\r\n\u00a0\u00a0\u00a0 }\r\n  }\r\n  date {\r\n    match =&gt; [ \"timestamp\" , \"dd\/MMM\/yyyy:HH:mm:ss Z\" ]\r\n    # si los meses estan en ingles, u otro lenguaje en tal caso\r\n    locale =&gt; \"en\"\r\n  }\r\n}\r\noutput {\r\n  elasticsearch { host =&gt; localhost }\r\n  # salida estandar coloreada, util para debug\r\n  #stdout { codec =&gt; rubydebug }\r\n}\r\n<\/pre>\n<p>Todo este archivo tiene su l\u00f3gica <a href=\"http:\/\/logstash.net\/docs\/1.4.2\/\">seg\u00fan la documentaci\u00f3n de logstash<\/a>.<\/p>\n<h3>Paso 6. Iniciar logstash+kibana con la configuracion dada<\/h3>\n<pre>echo Iniciando Logstash. Aguarde 15s ...\r\nlogstash-1.4.2\/bin\/logstash -f logstash-apache.conf -- web &amp;\r\nsleep 15<\/pre>\n<h3>Paso 7. Levantar un navegador web<\/h3>\n<pre>xdg-open \"<a href=\"http:\/\/localhost:9292\/index.html#\/dashboard\/file\/logstash.json\">http:\/\/localhost:9292\/index.html#\/dashboard\/file\/logstash.json<\/a>\"<\/pre>\n<h3>Paso 8. Jueguen con los filtros, los gr\u00e1ficos y del\u00e9itense con la visualizaci\u00f3n.<\/h3>\n<p>F\u00edjense de qu\u00e9 epoca son las entradas del log, pues puede que tengan que modificar algunas cosas para que Kibana les encuentre los eventos para esas fechas. Por ejemplo, el log de apache que les pas\u00e9\u00a0solo tiene entradas para el mes de\u00a0julio\u00a0de 2014, as\u00ed que seleccionen ese rango en el filtro de fechas de Kibana.<\/p>\n<p>Ac\u00e1 les dejo algunas capturas de lo que pueden llegar a hacer, que si bien no son de an\u00e1lisis de\u00a0apache, dan una idea de las posibilidades:<\/p>\n<p><a href=\"http:\/\/techblog.net-a-porter.com\/wp-content\/uploads\/2013\/11\/logstash_blog-1024x514.png\"><img decoding=\"async\" class=\" alignnone\" src=\"http:\/\/techblog.net-a-porter.com\/wp-content\/uploads\/2013\/11\/logstash_blog-1024x514.png\" alt=\"\" width=\"400\" \/><\/a><a href=\"http:\/\/www.elasticsearch.org\/content\/uploads\/2014\/03\/Screen-Shot-2014-02-25-at-4.42.52-PM.png\"><img decoding=\"async\" class=\"alignnone\" src=\"http:\/\/www.elasticsearch.org\/content\/uploads\/2014\/03\/Screen-Shot-2014-02-25-at-4.42.52-PM.png\" alt=\"\" width=\"400\" \/><\/a><a href=\"https:\/\/inliniac.files.wordpress.com\/2014\/07\/kibana-flow.png\"><img decoding=\"async\" class=\"alignnone\" src=\"https:\/\/inliniac.files.wordpress.com\/2014\/07\/kibana-flow.png\" alt=\"\" width=\"400\" \/><\/a><\/p>\n<h3>Paso 9. Terminar la tarea<\/h3>\n<p>Para cerrar los procesos, matelos sanamente con <code>kill PID<\/code>\u00a0a cada proceso java asociado.<\/p>\n<p>Ah, y una menci\u00f3n antes de terminar: cada vez que logstash procesa un archivo, anota hasta donde\u00a0ley\u00f3 para no volver a cargar la informaci\u00f3n, por lo que si est\u00e1n\u00a0jugando con la configuraci\u00f3n van a tener que borrar unos archivos <code>.sincedb_algo<\/code> que genera en el directorio <code>$HOME<\/code> del usuario para que vuelva a recorrer el mismo log.<\/p>\n<p>Por \u00faltimo, en este caso estamos parseando son entradas de accesos a un sitio web, pero el combo ELK puede procesar casi cualquier tipo de flujo de eventos, y si bien java mucho no me atrae, <strong>todo este paquete vale la pena<\/strong>; piensen cuanto habr\u00edan tardado en programar ustedes una interfaz tan flexible y completa&#8230;<\/p>\n<p>Como s\u00e9 que ustedes son tan haraganes como yo, ac\u00e1 tienen <a href=\"http:\/\/maurom.com\/files\/intro-logstash.sh\">todo en un solo script<\/a> que lo hace de una.<\/p>\n<p>Si se quedaron manija, ac\u00e1 van algunas demos y algo de documentaci\u00f3n:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=GrdzX9BNfkg\">Introduction and Demo to the Elasticsearch, Logstash and Kibana<\/a> (YouTube)<\/li>\n<li><a href=\"http:\/\/www.slidesearch.org\/slide\/eko10-security-monitoring-for-big-infrastructures-without-a-million-dollar-budget-juan-berner-hernan-costante\">C\u00f3mo lo usan los muchachos de MercadoLibre<\/a> (Slides)<\/li>\n<li><a href=\"http:\/\/elmanytas.es\/?q=node\/320\">Introducci\u00f3n a ELK (Elasticsearch, Logstash y Kibana) (parte 2)<\/a><\/li>\n<li><a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-use-logstash-and-kibana-to-centralize-and-visualize-logs-on-ubuntu-14-04\">How To Use Logstash and Kibana To Centralize Logs On Ubuntu 14.04<\/a><\/li>\n<\/ul>\n<p>Eso es todo por hoy.\u00a0<strong>Feliz an\u00e1lisis y Felices fiestas!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A partir de una idea de Santiago, y tomando como base algunos componentes que los muchachos de MercadoLibre utilizan para su infraestructura de gesti\u00f3n de logs, se me ocurri\u00f3 hacer una prueba de concepto de a lo que es posible arribar r\u00e1pidamente utilizando la tr\u00edada ElasticSearch + Logstash + Kibana, m\u00e1s conocida com ELK. Para [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[6,14,15],"_links":{"self":[{"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/posts\/1059"}],"collection":[{"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/comments?post=1059"}],"version-history":[{"count":0,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/posts\/1059\/revisions"}],"wp:attachment":[{"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/media?parent=1059"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/categories?post=1059"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/tags?post=1059"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}