# MCLogger **Minecraft 1.20–1.21 · Paper + Velocity · MariaDB · Flask-Admin** Autor: **SimolZimol** Umfassendes Logging-System für Minecraft-Netzwerke. Alle relevanten Events werden asynchron in einer MariaDB-Datenbank gespeichert und über ein modernes Flask-Webinterface auswertbar. --- ## Projektstruktur ``` Log/ ├── database/ │ └── schema.sql ← MariaDB-Schema (einmalig ausführen) │ ├── paper-plugin/ ← Maven-Projekt für Paper 1.20-1.21 │ ├── pom.xml │ └── src/main/ │ ├── java/de/simolzimol/mclogger/paper/ │ │ ├── PaperLoggerPlugin.java │ │ ├── database/DatabaseManager.java │ │ └── listeners/ │ │ ├── PlayerSessionListener.java │ │ ├── PlayerChatCommandListener.java │ │ ├── PlayerDeathListener.java │ │ ├── PlayerMiscListener.java │ │ ├── BlockListener.java │ │ ├── EntityListener.java │ │ ├── InventoryListener.java │ │ └── WorldListener.java │ └── resources/ │ ├── plugin.yml │ └── config.yml │ ├── velocity-plugin/ ← Maven-Projekt für Velocity 3.x │ ├── pom.xml │ └── src/main/ │ ├── java/de/simolzimol/mclogger/velocity/ │ │ ├── VelocityLoggerPlugin.java │ │ ├── database/VelocityDatabaseManager.java │ │ └── listeners/VelocityEventListener.java │ └── resources/ │ └── velocity-config.yml │ └── web/ ← Python Flask Admin-Interface ├── app.py ├── config.py ├── requirements.txt ├── templates/ │ ├── base.html │ ├── login.html │ ├── dashboard.html │ ├── players.html │ ├── player_detail.html │ ├── chat.html │ ├── commands.html │ ├── blocks.html │ ├── deaths.html │ ├── proxy.html │ ├── sessions.html │ ├── server_events.html │ └── _pagination.html └── static/ ├── css/style.css └── js/main.js ``` --- ## Was wird geloggt? ### Paper-Server | Kategorie | Events | |-----------|--------| | **Sessions** | Login, Logout, Kick (+ IP, Client-Version, Sprache) | | **Chat** | Alle Chat-Nachrichten mit Welt und Server | | **Commands** | Alle Spieler-Befehle mit Position | | **Tode** | Ursache, Mörder, verlorene Items, XP-Level | | **Respawn** | Bett / Ankerpunkt / Normalrespawn | | **Teleport** | Alle Ursachen (Portal, Command, Plugin usw.) | | **Gamemode** | Wechsel mit Ursache | | **Level/XP** | Level-Änderungen | | **Blöcke** | Break, Place, Ignite, Burn, Explode + Werkzeug, SilkTouch | | **Schilder** | Alle Sign-Änderungen mit Inhalt | | **Entities** | Spawn, Tod, Schaden (durch Spieler), Zähmen, Züchten, Explosion | | **PvP** | Schaden zwischen Spielern | | **Inventar** | Item aufheben/fallenlassen, Crafting, Verzauberung, Amboss, Handel | | **Welt** | Wetter, Donner, Portal, Baum-/Pilzwachstum, Welt-Load/Unload | | **Server** | Start, Stop, Player-Join, Player-Quit, Kick | | **Diverses** | Bett betreten/verlassen, Hand-Item-Wechsel, Angeln, Schlafen, Entity-Interaktion, Welt-Wechsel | ### Velocity-Proxy | Kategorie | Events | |-----------|--------| | **Verbindungen** | Login (+ IP, Protocol-Version, Client-Brand, Ping) | | **Disconnect** | Grund + Sitzungsdauer | | **Server-Wechsel** | Von → Nach-Server | | **Chat** | Proxy-Level-Chat | | **Commands** | Proxy-Level-Commands | | **Proxy** | Start / Stop | --- ## Voraussetzungen - **Java 17+** - **Maven 3.8+** - **MariaDB 10.6+** / MySQL 8+ - **Paper 1.20–1.21** - **Velocity 3.x** - **Python 3.10+** --- ## 1. Datenbank einrichten ```sql -- Als root in MariaDB: SOURCE /pfad/zu/database/schema.sql; -- Benutzer anlegen: CREATE USER 'mclogger'@'%' IDENTIFIED BY 'sicheres_passwort'; GRANT ALL PRIVILEGES ON mclogger.* TO 'mclogger'@'%'; FLUSH PRIVILEGES; ``` --- ## 2. Paper-Plugin bauen & installieren ```bash cd paper-plugin mvn clean package -q cp target/mclogger-paper-1.0.0.jar /dein/paper-server/plugins/ ``` Konfiguration bearbeiten (`plugins/MCLogger/config.yml`): ```yaml server: name: "survival-01" # eindeutiger Name database: host: "localhost" port: 3306 database: "mclogger" username: "mclogger" password: "sicheres_passwort" ``` Server neu starten. --- ## 3. Velocity-Plugin bauen & installieren ```bash cd velocity-plugin mvn clean package -q cp target/mclogger-velocity-1.0.0.jar /dein/velocity-proxy/plugins/ ``` Konfiguration bearbeiten (`plugins/mclogger-velocity/velocity-config.yml`): ```yaml proxy: name: "proxy-01" database: host: "localhost" port: 3306 database: "mclogger" username: "mclogger" password: "sicheres_passwort" ``` Proxy neu starten. --- ## 4. Flask-Webinterface starten ```bash cd web # Python-Umgebung (empfohlen) python -m venv venv venv\Scripts\activate # Windows source venv/bin/activate # Linux/Mac pip install -r requirements.txt # Umgebungsvariablen setzen (oder config.py direkt bearbeiten) set MCLOGGER_DB_HOST=localhost set MCLOGGER_DB_PASSWORD=sicheres_passwort set MCLOGGER_ADMIN_PASSWORD=admin_passwort set MCLOGGER_SECRET_KEY=zufaelliger_32_zeichen_schluessel python app.py ``` Webinterface öffnen: **http://localhost:5000** ### Für Produktion (Linux mit Gunicorn) ```bash pip install gunicorn gunicorn -w 4 -b 0.0.0.0:5000 app:app ``` Oder als systemd-Service: ```ini [Unit] Description=MCLogger Web [Service] WorkingDirectory=/opt/mclogger/web Environment=MCLOGGER_DB_HOST=localhost Environment=MCLOGGER_DB_PASSWORD=sicheres_passwort Environment=MCLOGGER_ADMIN_PASSWORD=admin_passwort Environment=MCLOGGER_SECRET_KEY=... ExecStart=/opt/mclogger/web/venv/bin/gunicorn -w 2 -b 127.0.0.1:5000 app:app Restart=always [Install] WantedBy=multi-user.target ``` --- ## Webinterface-Features | Seite | Beschreibung | |-------|-------------| | **Dashboard** | Live-Statistiken, Online-Spieler, Aktivitäts-Charts, Top-Playtime | | **Spieler** | Suchbare Spielerliste mit Profil-Details | | **Spielerprofil** | Sessions, Chat, Commands, Tode, Teleports, Stats, Proxy-Events in Tabs | | **Sessions** | Alle Login-/Logout-Sitzungen mit Filterfunktion | | **Chat** | Volltext-Suche in allen Chat-Nachrichten | | **Commands** | Alle ausgeführten Befehle | | **Block-Events** | Break/Place/Ignite usw. mit Positions-Info | | **Tode** | Tode mit Ursache, Mörder und Todes-Meldung | | **Proxy-Events** | Login, Disconnect, Server-Wechsel usw. | | **Server-Events** | Start/Stop und reine Server-Ereignisse | --- ## Konfigurationsvariablen (Umgebungsvariablen) | Variable | Standard | Beschreibung | |----------|----------|-------------| | `MCLOGGER_DB_HOST` | `localhost` | MariaDB-Host | | `MCLOGGER_DB_PORT` | `3306` | MariaDB-Port | | `MCLOGGER_DB_USER` | `mclogger` | DB-Benutzer | | `MCLOGGER_DB_PASSWORD` | *(leer)* | DB-Passwort | | `MCLOGGER_DB_NAME` | `mclogger` | Datenbankname | | `MCLOGGER_HOST` | `0.0.0.0` | Webserver-Bind | | `MCLOGGER_PORT` | `5000` | Webserver-Port | | `MCLOGGER_ADMIN_USER` | `admin` | Admin-Login | | `MCLOGGER_ADMIN_PASSWORD` | *(leer)* | Admin-Passwort | | `MCLOGGER_SECRET_KEY` | *(unsicher)* | Flask Session-Key | --- ## Performance-Hinweise - Alle Datenbank-Writes erfolgen **asynchron** → kein Tick-Lag - HikariCP Connection-Pool voreingestellt auf 10 (Paper) / 5 (Velocity) - Entity-Spawn-Logging ist standardmäßig **deaktiviert** (sehr viele Events) - Block-Events können bei Farms sehr viele Einträge erzeugen → ggf. `blocks-break-only: true` - Ein regelmäßiges DB-Backup empfiehlt sich (Events wachsen schnell) - MariaDB: Index-Tuning für `timestamp`-Spalten ist bereits im Schema enthalten --- ## Lizenz MIT – Frei verwendbar, SimolZimol als Autor nennen.