Skip to content

Commit 7b71519

Browse files
Docs: Translate README to Dutch and add Author Tiëndo Welles
1 parent b91e496 commit 7b71519

File tree

1 file changed

+50
-49
lines changed

1 file changed

+50
-49
lines changed

README.md

Lines changed: 50 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,50 @@
11
# ⚡ High-Performance Streaming Log Analyzer (C++17)
22

3-
A production-grade, streaming log analysis engine built with modern C++17 and a responsive ImGui frontend. Designed for high throughput, low latency, and zero-copy parsing.
3+
Een productie-waardige, streaming log analyse engine gebouwd met modern C++17 en een responsieve ImGui frontend. Ontworpen voor hoge doorvoer, lage latency en zero-copy parsing.
44

55
![Version](https://img.shields.io/badge/version-1.0.0-blue.svg)
66
![C++](https://img.shields.io/badge/std-c%2B%2B17-blue.svg)
77
![License](https://img.shields.io/badge/license-MIT-green.svg)
88
![Build Status](https://github.com/parvenuprompting/log-analyzer/actions/workflows/ci.yml/badge.svg)
99

10-
## 🎯 Project Goals & Philosophy
11-
This project serves as a **Core Infrastructure Portfolio Piece**, demonstrating:
12-
* **Zero-Copy Architecture**: Extensive use of `std::string_view` to minimize heap allocations.
13-
* **Streaming Pipeline**: Processes logs line-by-line using `O(1)` memory, regardless of file size (tested with 10GB+ files).
14-
* **Modern tooling**: Catch2 v3 for testing, CI/CD via GitHub Actions, and deterministic sorting strategies.
15-
* **Dual Frontend**: A headless CLI for scripting and a hardware-accelerated GUI (ImGui) for interactive analysis.
10+
## 🎯 Project Doelen & Filosofie
11+
Dit project dient als een **Core Infrastructure Portfolio Piece**, en demonstreert:
12+
* **Zero-Copy Architectuur**: Uitgebreid gebruik van `std::string_view` om heap allocaties te minimaliseren.
13+
* **Streaming Pipeline**: Verwerkt logs regel-voor-regel met `O(1)` geheugen, ongeacht de bestandsgrootte (getest met 10GB+ bestanden).
14+
* **Moderne Tooling**: Catch2 v3 voor testing, CI/CD via GitHub Actions, en deterministische sorteerstrategieën.
15+
* **Dual Frontend**: Een headless CLI voor scripting en een hardware-versnelde GUI (ImGui) voor interactieve analyse.
1616

17-
## Key Features
17+
## Belangrijkste Kenmerken
1818

1919
### Core Engine
20-
* **High-Performance Parsing**: Custom `find()`-based parser (no Regex) processing **~2 million lines/sec**.
21-
* **Robust Timestamp Handling**: Strict calendar validation (leap years, days-per-month logic) using `std::from_chars`.
22-
* **Pluggable Analyzers**: interface-based design allowing easy addition of new metrics.
20+
* **High-Performance Parsing**: Custom `find()`-based parser (geen Regex) die **~2 miljoen regels/sec** verwerkt.
21+
* **Robuuste Timestamp Afhandeling**: Strikte kalendervalidatie (schrikkeljaren, dagen-per-maand logica) met `std::from_chars`.
22+
* **Pluggable Analyzers**: Interface-based ontwerp waarmee eenvoudig nieuwe metrieken toegevoegd kunnen worden.
2323
* `LevelCountAnalyzer`
2424
* `KeywordHitAnalyzer`
25-
* `TopErrorAnalyzer` (Bounded-space algorithm for "Top N" problems)
25+
* `TopErrorAnalyzer` (Bounded-space algoritme voor "Top N" problemen)
2626

27-
### Modern GUI
28-
* **Responsive**: Analysis runs in a background thread, keeping the UI at 60 FPS.
29-
* **Interactive**: Sortable tables, real-time progress bar, and cancellation support.
30-
* **Visuals**: Custom-drawn charts and "Dark Coral" theme.
31-
* **Dependency-Lite**: Custom file picker using C++17 `<filesystem>` (no heavy external libs).
27+
### Moderne GUI
28+
* **Responsief**: Analyse draait in een achtergrond-thread, waardoor de UI op 60 FPS blijft draaien.
29+
* **Interactief**: Sorteerbare tabellen, real-time voortgangsbalk en ondersteuning voor annuleren.
30+
* **Visuals**: Custom-drawn grafieken en een "Dark Coral" thema.
31+
* **Dependency-Lite**: Custom file picker gebruikmakend van C++17 `<filesystem>` (geen zware externe libs).
3232

3333
## 📊 Performance Benchmark
34-
Processing a generated log file with **1,000,000 lines** (approx 100MB):
34+
Verwerking van een gegenereerd logbestand met **1,000,000 regels** (ongeveer 100MB):
3535

36-
| Metric | Result |
36+
| Metriek | Resultaat |
3737
|--------|--------|
38-
| **Execution Time** | **0.52s** |
39-
| **Throughput** | **~1.92M lines/sec** |
40-
| **Memory Usage** | **< 10MB** (constant) |
38+
| **Executietijd** | **0.52s** |
39+
| **Doorvoer** | **~1.92M regels/sec** |
40+
| **Geheugengebruik** | **< 10MB** (constant) |
4141
| **Platform** | macOS M1, Single Thread |
4242

43-
*Benchmark run via `make log_analyzer` on 2026-01-05*
43+
*Benchmark uitgevoerd via `cmake build` op 2026-01-05*
4444

45-
## 🏗 Architecture
45+
## 🏗 Architectuur
4646

47-
The system follows a strict **Layered Architecture**:
47+
Het systeem volgt een strikte **Gelaagde Architectuur**:
4848

4949
```mermaid
5050
graph TD
@@ -56,18 +56,18 @@ graph TD
5656
PIPELINE --> ANALYZERS[Analyzer Collection]
5757
```
5858

59-
* **Core**: Domain types (`LogEntry`, `Timestamp`) and stateless logic.
60-
* **IO**: RAII wrappers for file streaming.
61-
* **Analysis**: Stateful analyzers implementing `IAnalyzer`.
62-
* **App**: Orchestration layer handling errors (`AppResult`, `AppStatus`).
63-
* **GUI/CLI**: Thin adapters calling the App layer.
59+
* **Core**: Domeintypes (`LogEntry`, `Timestamp`) en stateloze logica.
60+
* **IO**: RAII wrappers voor file streaming.
61+
* **Analysis**: State-houdende analyzers die `IAnalyzer` implementeren.
62+
* **App**: Orchestratie-laag die foutafhandeling beheert (`AppResult`, `AppStatus`).
63+
* **GUI/CLI**: Dunne adapters die de App-laag aanroepen.
6464

6565
## 🚀 Quick Start
6666

67-
### Prerequisites
67+
### Vereisten
6868
* C++17 compliant compiler (Clang/GCC/MSVC)
69-
* Make
70-
* GLFW (for GUI only): `brew install glfw` (macOS) or `apt-get install libglfw3-dev` (Linux)
69+
* CMake (3.14+)
70+
* GLFW (alleen voor GUI): `brew install glfw` (macOS) of `apt-get install libglfw3-dev` (Linux)
7171

7272
### Build & Run
7373
```bash
@@ -91,27 +91,28 @@ make
9191
ctest
9292
```
9393

94-
## 🛠 Design Decisions & Trade-offs
94+
## 🛠 Ontwerpkeuzes & Trade-offs (Design Decisions)
9595

9696
### 1. `std::string_view` vs `std::string`
97-
**Decision:** Used `string_view` for all parsing interfaces.
98-
* **Pro:** Zero allocation during parsing. A line is read into a reusable buffer, and fields are just pointers into that buffer.
99-
* **Con:** Requires careful lifetime management (views are invalid after next line read).
100-
* **Mitigation:** `LogEntry` owns its data (deep copy) only when stored for "Top N" aggregation, but statistical analyzers don't need storage.
97+
**Keuze:** Gebruik van `string_view` voor alle parsing interfaces.
98+
* **Pro:** Nul allocaties tijdens parsing. Een regel wordt in een herbruikbare buffer gelezen en velden zijn slechts pointers naar die buffer.
99+
* **Con:** Vereist zorgvuldig levensduurbeheer (views zijn ongeldig na het lezen van de volgende regel).
100+
* **Mitigatie:** `LogEntry` neemt eigendom over van data (deep copy) alleen wanneer opgeslagen voor "Top N" aggregatie, maar statistische analyzers hebben geen opslag nodig.
101101

102102
### 2. Custom Parser vs Regex
103-
**Decision:** Hand-written parser using `find()` and `from_chars`.
104-
* **Reason:** Regex is convenient but orders of magnitude slower for simple log formats. `from_chars` (C++17) provides the fastest integer conversion available.
103+
**Keuze:** Handgeschreven parser met `find()` en `from_chars`.
104+
* **Reden:** Regex is handig maar ordes van grootte trager voor eenvoudige logformaten. `from_chars` (C++17) biedt de snelst mogelijke integer conversie.
105105

106106
### 3. Immediate vs Deferred Sorting
107-
**Decision:** "Lazy Sorting" for Top Errors.
108-
* **Mechanism:** `TopErrorAnalyzer` accumulates counts in a `std::map`. Sorting happens only once at `finalize()`, ensuring `O(N)` insertion and `O(K log K)` final sort (where K is unique error messages, not total lines).
107+
**Keuze:** "Lazy Sorting" voor Top Errors.
108+
* **Mechanisme:** `TopErrorAnalyzer` accumuleert tellingen in een `std::map`. Sorteren gebeurt pas eenmalig bij `finalize()`, wat zorgt voor `O(N)` insertie en `O(K log K)` uiteindelijke sortering (waarbij K unieke foutmeldingen zijn, niet het totaal aantal regels).
109109

110110
## 🧪 Testing
111-
The project uses **Catch2 v3** for reliable unit testing:
112-
* **Coverage:** 12 Test Cases, 47 Assertions.
113-
* **Scope:** Parser edge cases, Timestamp validation, Analyzer determinism, Integration tests.
114-
* **CI:** Automated testing on every push via GitHub Actions.
115-
116-
## 👥 Author
117-
Built as a high-performance C++ portfolio project.
111+
Het project gebruikt **Catch2 v3** voor betrouwbare unit testing:
112+
* **Coverage:** 15 Test Cases, 50+ Assertions.
113+
* **Scope:** Parser randgevallen (edge cases), Timestamp validatie, Analyzer determinisme, Integratie tests.
114+
* **CI:** Geautomatiseerde testing bij elke push via GitHub Actions.
115+
116+
## 👥 Auteur
117+
**Tiëndo Welles**
118+
*High-Performance C++ Portfolio Project*

0 commit comments

Comments
 (0)