<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Automate Everything]]></title><description><![CDATA[Automate Everything]]></description><link>https://automate-everything.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 13 Nov 2026 20:10:03 GMT</lastBuildDate><atom:link href="https://automate-everything.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Getting Started with the ELK Stack — Visualize Nginx Logs Like a Pro]]></title><description><![CDATA[Set up the ELK Stack to capture, analyze, and visualize Nginx logs in real-time with this comprehensive guide]]></description><link>https://automate-everything.hashnode.dev/real-time-nginx-log-monitoring-with-elk</link><guid isPermaLink="true">https://automate-everything.hashnode.dev/real-time-nginx-log-monitoring-with-elk</guid><category><![CDATA[ElasticStack]]></category><category><![CDATA[Devops]]></category><category><![CDATA[logging]]></category><category><![CDATA[monitoring]]></category><category><![CDATA[kibana]]></category><category><![CDATA[elasticsearch]]></category><category><![CDATA[logstash]]></category><category><![CDATA[filebeat]]></category><category><![CDATA[Docker]]></category><category><![CDATA[observability]]></category><dc:creator><![CDATA[Hasibur shanto]]></dc:creator><pubDate>Sun, 26 Oct 2025 16:58:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761497095163/a30db4b5-cdbc-4a94-be30-b0ff2f9683d3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-collecting-and-analyzing-logs-with-elk-stack-elasticsearch-logstash-kibana-and-filebeat">Collecting and Analyzing Logs with ELK Stack (Elasticsearch, Logstash, Kibana, and Filebeat)</h1>
<h2 id="heading-overview-amp-objectives">🧩 Overview &amp; Objectives</h2>
<p>In this guide, we’ll build a complete log collection and visualization pipeline using the <strong>ELK Stack</strong> — <strong>Elasticsearch</strong>, <strong>Logstash</strong>, <strong>Kibana</strong>, and <strong>Filebeat</strong>.</p>
<p>We’ll:</p>
<ul>
<li><p>Capture live Nginx logs in real time.</p>
</li>
<li><p>Send and parse them through Logstash.</p>
</li>
<li><p>Store them in Elasticsearch.</p>
</li>
<li><p>Visualize them using Kibana dashboards.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761482300191/999fbe29-1ae4-4ede-ab78-798dd4be976b.png" alt class="image--center mx-auto" /></p>
<p>By the end, you’ll have a fully functional monitoring system showing traffic trends, error rates, and response distributions.</p>
<hr />
<h2 id="heading-1-setup-and-configure-nginx">⚙️ 1. Setup and Configure Nginx</h2>
<p>We’ll create a simple frontend application served by Nginx that returns different HTTP response codes — <code>200</code>, <code>404</code>, and <code>500</code>.</p>
<h3 id="heading-11-install-nginx">🧩 1.1 Install Nginx</h3>
<pre><code class="lang-bash">sudo apt update
sudo apt install -y nginx
sudo systemctl <span class="hljs-built_in">enable</span> --now nginx
</code></pre>
<h3 id="heading-12-create-a-basic-html-page">🌐 1.2 Create a Basic HTML Page</h3>
<pre><code class="lang-bash">sudo mkdir -p /var/www/frontend
sudo nano /var/www/frontend/index.html
</code></pre>
<p>Paste:</p>
<pre><code class="lang-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Frontend Test<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="css">
    <span class="hljs-selector-tag">body</span> {<span class="hljs-attribute">display</span>: flex; <span class="hljs-attribute">align-items</span>: center; <span class="hljs-attribute">justify-content</span>: center; <span class="hljs-attribute">height</span>: <span class="hljs-number">100vh</span>; <span class="hljs-attribute">flex-direction</span>: column;}
  </span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Welcome to the Frontend!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Status: 200 OK<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<hr />
<h3 id="heading-13-configure-nginx-with-json-logs">💾 1.3 Configure Nginx with JSON Logs</h3>
<pre><code class="lang-bash">sudo tee /etc/nginx/sites-available/frontend.conf &gt; /dev/null &lt;&lt;<span class="hljs-string">'EOF'</span>
log_format elk_logging escape=json <span class="hljs-string">'{'</span>
    <span class="hljs-string">'"timestamp": "$time_iso8601",'</span>
    <span class="hljs-string">'"remote_addr": "$http_x_forwarded_for",'</span>
    <span class="hljs-string">'"proxy_addr": "$remote_addr",'</span>
    <span class="hljs-string">'"request": "$request",'</span>
    <span class="hljs-string">'"status": "$status",'</span>
    <span class="hljs-string">'"body_bytes_sent": "$body_bytes_sent",'</span>
    <span class="hljs-string">'"http_user_agent": "$http_user_agent"'</span>
<span class="hljs-string">'}'</span>;

server {
    listen 80;
    server_name localhost;
    root /var/www/frontend;
    index index.html;
    access_log /var/<span class="hljs-built_in">log</span>/nginx/frontend_access.log elk_logging;
    error_log /var/<span class="hljs-built_in">log</span>/nginx/frontend_error.log;
    location / { try_files <span class="hljs-variable">$uri</span> <span class="hljs-variable">$uri</span>/ =404; }
    location /error500 { <span class="hljs-built_in">return</span> 500; }
}
EOF
</code></pre>
<p>Enable and reload:</p>
<pre><code class="lang-bash">sudo ln -s /etc/nginx/sites-available/frontend.conf /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t &amp;&amp; sudo systemctl reload nginx
</code></pre>
<hr />
<h3 id="heading-14-test-endpoints">🔍 1.4 Test Endpoints</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761482422394/3ce2baad-f517-4261-ab32-4d00204ec064.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-bash">curl -I http://localhost/           <span class="hljs-comment"># ✅ 200 OK</span>
curl -I http://localhost/notfound   <span class="hljs-comment"># ❌ 404 Not Found</span>
curl -I http://localhost/error500   <span class="hljs-comment"># 💥 500 Internal Server Error</span>
</code></pre>
<hr />
<h3 id="heading-15-verify-access-logs">1.5. Verify Access Logs</h3>
<p>View the last few entries from the custom JSON log:</p>
<pre><code class="lang-plaintext">sudo tail -n 5 /var/log/nginx/frontend_access.log
</code></pre>
<p>Example output:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761482553448/bdcff294-f20b-49f0-9fa3-52e2a5d9b654.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-16-simulate-load">🚦 1.6 Simulate Load</h3>
<p>Create a bash script:</p>
<pre><code class="lang-bash">sudo nano load_test.sh
</code></pre>
<p>Paste:</p>
<pre><code class="lang-bash"><span class="hljs-meta">#!/bin/bash</span>
URL=<span class="hljs-string">"http://localhost"</span>
DURATION=60
DELAY=0.2
START=$(date +%s)
<span class="hljs-keyword">while</span> [ $(( $(date +%s) - START )) -lt <span class="hljs-variable">$DURATION</span> ]; <span class="hljs-keyword">do</span>
  RAND=$((RANDOM % <span class="hljs-number">10</span>))
  <span class="hljs-keyword">case</span> <span class="hljs-variable">$RAND</span> <span class="hljs-keyword">in</span>
    [0-5]) ENDPOINT=<span class="hljs-string">"/"</span> ;;
    [6-8]) ENDPOINT=<span class="hljs-string">"/notfound"</span> ;;
    9) ENDPOINT=<span class="hljs-string">"/error500"</span> ;;
  <span class="hljs-keyword">esac</span>
  curl -s -o /dev/null <span class="hljs-string">"<span class="hljs-variable">$URL</span><span class="hljs-variable">$ENDPOINT</span>"</span>
  sleep <span class="hljs-variable">$DELAY</span>
<span class="hljs-keyword">done</span>
</code></pre>
<p>Run it:</p>
<pre><code class="lang-bash">chmod +x load_test.sh
./load_test.sh
</code></pre>
<hr />
<h2 id="heading-2-elk-stack-with-docker-compose">🐳 2. ELK Stack with Docker Compose</h2>
<p>Create docker-compose.yml in a folder (e.g., /root/elk-stack):</p>
<pre><code class="lang-yaml"><span class="hljs-attr">version:</span> <span class="hljs-string">'3.8'</span>
<span class="hljs-attr">services:</span>
  <span class="hljs-attr">elasticsearch:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">docker.elastic.co/elasticsearch/elasticsearch:7.17.3</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">discovery.type=single-node</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">ES_JAVA_OPTS=-Xms1g</span> <span class="hljs-string">-Xmx1g</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">"9200:9200"</span>
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">esdata:/usr/share/elasticsearch/data</span>

  <span class="hljs-attr">logstash:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">docker.elastic.co/logstash/logstash:7.17.3</span>
    <span class="hljs-attr">depends_on:</span> [<span class="hljs-string">elasticsearch</span>]
    <span class="hljs-attr">ports:</span> [<span class="hljs-string">"5044:5044"</span>]
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">./logstash.conf:/usr/share/logstash/pipeline/logstash.conf</span>

  <span class="hljs-attr">kibana:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">docker.elastic.co/kibana/kibana:7.17.3</span>
    <span class="hljs-attr">depends_on:</span> [<span class="hljs-string">elasticsearch</span>]
    <span class="hljs-attr">environment:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">ELASTICSEARCH_HOSTS=http://elasticsearch:9200</span>
    <span class="hljs-attr">ports:</span> [<span class="hljs-string">"5601:5601"</span>]

<span class="hljs-attr">volumes:</span>
  <span class="hljs-attr">esdata:</span>
</code></pre>
<hr />
<h2 id="heading-3-logstash-pipeline">⚙️ 3. Logstash Pipeline</h2>
<p><code>logstash.conf</code>:</p>
<pre><code class="lang-plaintext">input { beats { port =&gt; 5044 } }

filter {
  json { source =&gt; "message" skip_on_invalid_json =&gt; true }
  mutate { add_field =&gt; { "server" =&gt; "nginx" } }
}

output {
  stdout { codec =&gt; rubydebug }
  elasticsearch {
    hosts =&gt; ["http://elasticsearch:9200"]
    index =&gt; "nginx-logs-%{+YYYY.MM.dd}"
  }
}
</code></pre>
<hr />
<h2 id="heading-4-filebeat-configuration">🧾 4. Filebeat Configuration</h2>
<p>Example <code>/etc/filebeat/filebeat.yml</code> for nginx:</p>
<pre><code class="lang-yaml"><span class="hljs-attr">filebeat.inputs:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">type:</span> <span class="hljs-string">log</span>
    <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
    <span class="hljs-attr">paths:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">/var/log/nginx/frontend_access.log</span>
    <span class="hljs-attr">json.keys_under_root:</span> <span class="hljs-literal">true</span>
    <span class="hljs-attr">fields:</span>
      <span class="hljs-attr">server:</span> <span class="hljs-string">nginx</span>

<span class="hljs-attr">output.logstash:</span>
  <span class="hljs-attr">hosts:</span> [<span class="hljs-string">"&lt;elk-server-ip&gt;:5044"</span>]
</code></pre>
<p>Run Filebeat container:</p>
<pre><code class="lang-bash">docker run -d --name=filebeat \
  -v /var/<span class="hljs-built_in">log</span>/nginx/frontend_access.log:/var/<span class="hljs-built_in">log</span>/nginx/frontend_access.log:ro \
  -v /etc/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro \
  docker.elastic.co/beats/filebeat:7.17.3
</code></pre>
<hr />
<h2 id="heading-5-start-elk-stack">🚀 5. Start ELK Stack</h2>
<pre><code class="lang-bash"><span class="hljs-built_in">cd</span> /root/elk-stack
docker compose up -d
</code></pre>
<p>Access:</p>
<ul>
<li><p><strong>Kibana</strong> →  http://&lt;server-ip&gt;:5601</p>
</li>
<li><p><strong>Elasticsearch</strong> → http://&lt;server-ip&gt;:9200</p>
</li>
</ul>
<hr />
<h2 id="heading-6-visualize-in-kibana">📊 6. Visualize in Kibana</h2>
<p>Once everything is running — <strong>Filebeat</strong>, <strong>Logstash</strong>, <strong>Elasticsearch</strong>, and <strong>Kibana</strong> — it’s time to visualize the logs collected from <strong>Nginx</strong>.</p>
<h3 id="heading-access-kibana"><strong>🌐 Access Kibana</strong></h3>
<p>Open your browser and go to:</p>
<pre><code class="lang-plaintext">http://&lt;server-ip&gt;:5601
</code></pre>
<p>If you see the <strong>Kibana dashboard</strong>, it means your <strong>Elasticsearch</strong> and <strong>Kibana</strong> containers are up and running successfully.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761482947671/9b390c72-ddf7-4a6a-84f4-9d79a007bc11.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-1-create-index-pattern"><strong>🧱 Step 1: Create Index Pattern</strong></h3>
<p>To view the Nginx logs in Kibana, you first need to create an <strong>Index Pattern</strong>.</p>
<ol>
<li><p>From the left sidebar, go to : <strong>Stack Management → Kibana → Index Patterns</strong></p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761483098273/e63b8fd8-bcfc-40d6-b97b-a9a73ed3d763.png" alt class="image--center mx-auto" /></p>
</li>
<li><p><strong>Click Create index pattern.</strong></p>
</li>
<li><p><strong>In the field for the pattern name, type:</strong>  <code>nginx*</code> <strong>(We’re using nginx* because Logstash is sending logs with this naming pattern.)</strong></p>
</li>
<li><p><strong>Set the Timestamp field (usually</strong> <code>@timestamp</code><strong>).</strong></p>
</li>
<li><p>Then <strong>Click Create index pattern.</strong></p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761483282721/68ff34c5-2a34-463f-8f9e-fbbfb021bde7.png" alt class="image--center mx-auto" /></p>
</li>
</ol>
<h3 id="heading-step-2-view-logs-in-discover"><strong>🔍 Step 2: View Logs in Discover</strong></h3>
<p>Now go to the <strong>Discover</strong> section from the sidebar.<br />You should start seeing live Nginx logs flowing in — each entry showing fields like status, request, and timestamp.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761483395894/8030ffdb-a5fb-4d19-8e1a-5aa8e81ef508.png" alt class="image--center mx-auto" /></p>
<p>To get quick insights, you can create simple visualizations:</p>
<ul>
<li><p>A <strong>bar chart</strong> showing counts of each status code (200, 404, 500)</p>
</li>
<li><p>A <strong>pie chart</strong> showing percentage distribution of responses</p>
</li>
<li><p>A <strong>time-series</strong> graph showing traffic over time</p>
</li>
</ul>
<p>These visualizations help you understand the overall health and error rate of your application traffic.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761483441653/1d4e164b-a157-493c-9220-ac3db333dcc8.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-summary">🧩 Summary</h2>
<p>✅ Configured Nginx with JSON logs<br />✅ Shipped logs via Filebeat → Logstash → Elasticsearch<br />✅ Visualized in Kibana<br />✅ Built a full monitoring pipeline</p>
<p>💡 You can also extend this to Docker or microservice logs by changing Filebeat paths to <code>/var/lib/docker/containers/*/*.log</code>.</p>
]]></content:encoded></item></channel></rss>