Building a Custom Log Analysis Tool With the ELK Stack

Logs are the quiet record of how an application, server, network, or cloud service behaves. When they remain scattered across text files and provider consoles, small failures become difficult to trace. A custom log analysis tool built with Elasticsearch, Logstash, and Kibana can turn those records into searchable evidence and useful operational signals.

The ELK Stack is flexible enough for a modest homelab, a PHP application, or a distributed production platform. Its value comes from the design around it: consistent event fields, sensible retention, clear dashboards, and alerts that reflect real operational priorities rather than every unusual line in a log file.

Australian organisations also need to consider practical constraints beyond query speed. Data residency, privacy obligations under the Privacy Act, the Essential Eight, and latency between local offices and overseas cloud regions can influence the architecture. A deployment supporting teams in Sydney, Melbourne, Perth, and Brisbane may need carefully chosen ingestion paths and time-zone handling.

The best starting point is a narrow operational problem. Tracking failed logins, slow API requests, storage errors, or cloud cost anomalies produces a useful first release. Once the pipeline is trusted, it can expand without becoming an expensive index for every message generated by every machine.

Define The Scope And Outcomes

Begin by identifying who will use the system and what decisions it must support. A systems administrator may need to find a failed service restart, while a developer may want a trace across several PHP workers. These uses require different fields, retention periods, and visualisations.

Write a small set of measurable outcomes before installing components. For example, an operator should be able to find all requests with a particular correlation ID, see the rate of HTTP 5xx responses over the last hour, and identify which host generated a storage warning. These outcomes prevent the project from turning into an unfocused collection of dashboards.

A proof of concept can run with Docker Compose on a local workstation or an internal virtual machine. Production workloads usually need separate nodes, encrypted transport, backups, and resource limits. For an Australian business, document whether logs may be stored in an Australian cloud region and whether the chosen provider meets internal governance requirements.

Shape A Consistent Event Schema

Search quality depends on structured data. A JSON event containing @timestamp, service.name, host.name, log.level, message, trace.id, http.response.status_code, and event.duration is much easier to analyse than a free-form sentence. Use ECS-compatible names where practical so that Kibana integrations and common queries remain useful.

Normalise timestamps at ingestion and store them in UTC. Kibana can display local time for an Australian operator, including the switch between AEST and AEDT, without corrupting comparisons between systems. Preserve the original timezone in a separate field when an application records local timestamps.

Keep high-cardinality values under control. A request ID is valuable for tracing one transaction, but indexing an unbounded debug payload, session token, or full URL query string can increase storage and expose personal information. Remove passwords, access tokens, and unnecessary customer data before events reach Elasticsearch.

Collect And Normalise Data

Filebeat or Elastic Agent is suitable for lightweight collection from Linux servers, containers, and virtual machines. Logstash becomes useful when the pipeline needs conditional routing, grok parsing, enrichment, redaction, or delivery to several destinations. A PHP application can emit JSON directly, avoiding fragile regular expressions for every new message format.

Create separate pipelines for web access logs, application events, operating system messages, and security records. Each pipeline should have a dead-letter strategy for malformed events. Rejected records should be visible and recoverable rather than silently discarded, because a parser failure during an incident can hide the evidence needed to diagnose it.

Synthetic data makes early development safer. A catalogue-style sample can provide varied titles, categories, prices, and identifiers; even a miniature bottle catalogue can be useful as a harmless source for testing field extraction and unusual text values. The production pipeline should still be tested with representative application and infrastructure events.

Signals Worth Capturing

Prioritise fields that support diagnosis, capacity planning, and security review. A compact first schema might include the following:

  • Event time, ingestion time, and source timezone
  • Host, container, service, environment, and deployment version
  • Severity, event category, action, and outcome
  • Request ID, trace ID, user-agent, and network context
  • Duration, response status, bytes, retry count, and error type

Logstash filters should parse predictable formats and tag exceptions clearly. A field such as pipeline.parse_error is more useful than replacing an unreadable message with a blank event. Keep the original message during the initial rollout, then reduce duplication after the parser has proved reliable.

Sampling can control volume without destroying visibility. Keep every error, authentication failure, and deployment event, while sampling repetitive successful health checks. For a branch office using an NBN connection with limited upload capacity, local buffering and compression can help prevent network interruptions from becoming data loss.

Build Useful Kibana Views

A dashboard should answer a specific operational question in seconds. An overview might show event volume, error rate, top affected services, and ingestion delay. A service view can combine latency percentiles, status-code trends, recent exceptions, and a table of correlated trace IDs.

Use filters consistently across visualisations. A selected environment, host group, or service should narrow every panel on the page. Runtime fields can be convenient during exploration, but frequently queried values should be extracted and mapped at ingestion so searches remain predictable and efficient.

Alerts should represent actionable conditions. A sudden rise in 5xx responses, repeated disk errors, or a growing ingestion delay deserves attention. A rule that pages someone for every brief timeout will quickly be ignored. Route notifications according to severity, with email or ticketing for investigation and an established on-call channel for urgent incidents.

Secure And Operate The Platform

Treat logs as sensitive operational data. Apply role-based access so developers can inspect application events without browsing security records or personal information. Encrypt traffic between agents, Logstash, Elasticsearch, and Kibana, and use managed identities or rotated credentials instead of secrets embedded in configuration files.

Retention should match the purpose of each dataset. High-volume debug events may need only a few days, while audit records may require a longer period defined by policy or contract. Use index lifecycle management to move older data to cheaper storage, then delete it according to an approved schedule. Keep snapshots separate from the live cluster and test restoration.

Operational safeguards belong in the design from the beginning:

  • Monitor cluster health, JVM pressure, disk watermarks, and shard counts
  • Set ingestion quotas so one noisy service cannot exhaust resources
  • Use Australian-region storage when privacy or contractual requirements demand it
  • Record access to dashboards and protected log indices
  • Document escalation paths, retention rules, and restore procedures

Review compliance with the organisation’s privacy impact process, especially when logs contain IP addresses, account identifiers, or employee activity. The Essential Eight can inform hardening around privileged access, patching, application control, and backups, while the Privacy Act shapes collection and handling practices.

Test And Evolve The Tool

Testing should cover the whole route from application output to dashboard and alert. Generate valid events, malformed records, delayed messages, duplicate events, multiline stack traces, and sudden volume spikes. Confirm that timestamps remain correct, sensitive fields are removed, and a failed downstream component does not silently lose data.

Load tests should reflect realistic Australian operating patterns. A retail service may experience sharp evening peaks in AEDT, while a business platform may see weekday traffic aligned with offices across multiple states. Test index growth, shard allocation, query latency, and storage consumption under those patterns instead of relying only on a quiet development dataset.

Parser changes need version control and regression fixtures. Store representative samples without confidential values, run them through automated tests, and compare the resulting schema. This prevents a small application release from changing status_code into an incompatible string or breaking dashboards that depend on a stable field.

External pages can also help test URL handling, encoded characters, redirects, and unusual response bodies; a fruit machine test offers one example of varied public content that can expose assumptions in a collector. Keep such checks isolated from production ingestion and respect access rules.

A custom ELK implementation earns its place when it shortens investigations and improves decisions. Start with one service, a documented schema, a handful of high-value queries, and a retention policy that fits the budget. Then measure search speed, alert quality, ingestion reliability, and operator effort as the system grows. Build the next iteration from evidence, and the log platform will become a dependable part of everyday infrastructure operations.

Experience

Information Technology Consulting

Independent Practice

Provides IT consulting services focused on infrastructure planning, cloud migration strategy, and systems architecture. Engagements draw on years of hands-on sysadmin and development experience across Linux, Windows, and hybrid environments.

K9 Search & Rescue Volunteer

Ongoing

Active participant in K9 Search & Rescue operations, combining technical logistics skills with field support for canine search teams.

Karl Katzke's Blog

October 2006 – May 2014

Published a long-running personal technology blog covering cloud vs. in-house infrastructure, F# and Mono on OSX, hardware vendor critiques, RAID card performance analysis, and sysadmin storytelling. Notable posts include "When Sysadmins Ruled the Earth" (May 15, 2014) and "Getting Started with F# and Mono on OSX" (December 22, 2012).

Credentials

A small badge icon with a shield shape in muted blue tones on a light background

Systems Administration

Deep experience with Linux (RHEL, SLES, CentOS), high-availability clusters, and STONITH configurations.

A small badge icon with a gear shape in muted blue tones on a light background

Cloud Infrastructure

Practical knowledge of AWS EC2, reserved instances, and cost analysis for cloud vs. on-premises deployments.

A small badge icon with a code symbol in muted blue tones on a light background

Development

Proficient in F#, PHP (Symfony), and cross-platform tooling including Mono and MonoDevelop on OSX.

Studies

F# & Functional Programming

Self-directed, 2012

Explored strongly typed functional programming with F# on OSX using the Mono runtime. Published a detailed getting-started guide covering toolchain setup and cross-platform game development research.

High-Availability & Cluster Management

Professional Development, 2009

Configured and documented crm_mon email alerting for STONITH events on SLES11-HAE clusters, integrating with Nagios monitoring for production environments.

Hardware & Storage Performance

Ongoing

Conducted hands-on benchmarking of SATA/SAS RAID controllers including HighPoint RocketRaid 2740 and LSI/SuperMicro AOC-USASLP2-H8iR, comparing against software RAID configurations.

Skills

A small icon representing a server with clean geometric lines in slate blue

Linux Administration

RHEL, SLES, CentOS — package management, kernel tuning, HA clustering, and monitoring integration.

A small icon representing a cloud shape with clean geometric lines in slate blue

Cloud Architecture

AWS EC2, reserved-instance planning, cost modeling, and hybrid infrastructure strategy.

A small icon representing code brackets with clean geometric lines in slate blue

F# & .NET/Mono

Functional programming on OSX, MonoDevelop toolchain, and cross-platform game-dev exploration.

A small icon representing a database cylinder with clean geometric lines in slate blue

PHP & Symfony

Web application development with the Symfony framework and the broader PHP ecosystem.

A small icon representing a storage drive with clean geometric lines in slate blue

Storage & RAID

SATA/SAS controller evaluation, md RAID configuration, and performance benchmarking.

A small icon representing a shield with clean geometric lines in slate blue

High Availability

Pacemaker, STONITH, crm_mon alerting, and Nagios integration for production cluster monitoring.