v0.1.1 - Improve logging system with rotation and separate error logs

### Changed
- Implement professional logging system with RotatingFileHandler
- Move logs from data/ to separate logs/ directory
- Add separate error.log with full tracebacks
- Configure automatic log rotation (10MB max, 5 backups)
- Add configurable log size and rotation settings
- Improve console output format

### Configuration
- New logging options in config.yaml:
  - max_bytes: 10485760 (10MB)
  - backup_count: 5
  - error_file: separate error log path

### Files
- logs/watchdog.log - Main log (all messages)
- logs/error.log - Error log (errors only with traceback)
- Auto-rotation: *.log.1-5 backups

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Schulz 2026-02-16 21:10:13 +01:00
parent c50e0d7c47
commit 30a72f5fa3
9 changed files with 160 additions and 21 deletions

5
.gitignore vendored
View File

@ -19,13 +19,12 @@ ENV/
data/*.db data/*.db
data/*.log data/*.log
data/backup.db data/backup.db
logs/*.log
logs/*.log.*
# Sensitive Config (optional - keep structure but remove secrets) # Sensitive Config (optional - keep structure but remove secrets)
# config/config.yaml # config/config.yaml
# Docker
*.log
# OS # OS
.DS_Store .DS_Store
Thumbs.db Thumbs.db

View File

@ -17,6 +17,36 @@ Das Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.0.0/).
--- ---
## [0.1.1] - 2026-02-16
### Changed - Verbesserte Funktionalität
- 📝 **Verbessertes Logging-System**
- Separates `logs/` Verzeichnis (statt `data/`)
- Automatische Log-Rotation mit `RotatingFileHandler`
- Maximale Größe: 10 MB pro Datei
- Backup-Count: 5 Dateien
- Separate Error-Logs (`error.log`) mit vollständigem Traceback
- Konfigurierbare Log-Größe und Rotation in `config.yaml`
- Bessere Console-Ausgabe (kürzeres Format)
### Technical Details
- `app/main.py`: Implementierung von RotatingFileHandler
- `config/config.yaml`: Neue Logging-Optionen (max_bytes, backup_count, error_file)
- `docker-compose.yml`: Volume-Mapping für logs/ Verzeichnis
- `.gitignore`: Log-Dateien und Rotationen ausgeschlossen
### Dateien
```
logs/
├── watchdog.log # Haupt-Log (alle Meldungen)
├── watchdog.log.1-5 # Rotierte Backups
├── error.log # Error-Log (nur Fehler)
└── error.log.1-5 # Rotierte Error-Backups
```
---
## [0.1.0] - 2024-02-16 ## [0.1.0] - 2024-02-16
### Added - Neue Features ### Added - Neue Features
@ -109,5 +139,6 @@ watchdog-docker/
- **Fixed** - Bugfixes - **Fixed** - Bugfixes
- **Security** - Sicherheits-Fixes - **Security** - Sicherheits-Fixes
[Unreleased]: https://tea.ffw-ak-ff.de/FFW-VG-AK-FF/watchdog-docker/compare/v0.1.0...HEAD [Unreleased]: https://tea.ffw-ak-ff.de/FFW-VG-AK-FF/watchdog-docker/compare/v0.1.1...HEAD
[0.1.1]: https://tea.ffw-ak-ff.de/FFW-VG-AK-FF/watchdog-docker/compare/v0.1.0...v0.1.1
[0.1.0]: https://tea.ffw-ak-ff.de/FFW-VG-AK-FF/watchdog-docker/releases/tag/v0.1.0 [0.1.0]: https://tea.ffw-ak-ff.de/FFW-VG-AK-FF/watchdog-docker/releases/tag/v0.1.0

View File

@ -102,7 +102,7 @@ All settings in `config/config.yaml`:
- Web port, secret key, admin password hash - Web port, secret key, admin password hash
- SMTP settings, recipients - SMTP settings, recipients
- Database path, retention days - Database path, retention days
- Logging level - **Logging:** level (DEBUG/INFO/WARNING/ERROR), file paths, rotation settings
## Important Notes ## Important Notes
@ -112,6 +112,7 @@ All settings in `config/config.yaml`:
- **Email Logic:** Only send emails for unknown devices (new_device event with known=False) - **Email Logic:** Only send emails for unknown devices (new_device event with known=False)
- **Retention:** Old events auto-cleanup based on retention_days (default 90) - **Retention:** Old events auto-cleanup based on retention_days (default 90)
- **Password:** Admin password must be werkzeug scrypt hash in config.yaml - **Password:** Admin password must be werkzeug scrypt hash in config.yaml
- **Logging:** Uses RotatingFileHandler with separate main log and error log, auto-rotation at 10MB
## Versioning ## Versioning

View File

@ -153,6 +153,8 @@ watchdog-docker/
├── docker-compose.yml # Docker Compose Konfiguration ├── docker-compose.yml # Docker Compose Konfiguration
├── requirements.txt # Python Dependencies ├── requirements.txt # Python Dependencies
├── README.md # Diese Datei ├── README.md # Diese Datei
├── VERSION # Aktuelle Version
├── CHANGELOG.md # Versionshistorie
├── config/ ├── config/
│ └── config.yaml # Hauptkonfiguration │ └── config.yaml # Hauptkonfiguration
├── app/ ├── app/
@ -164,9 +166,12 @@ watchdog-docker/
│ └── templates/ │ └── templates/
│ ├── login.html # Login-Seite │ ├── login.html # Login-Seite
│ └── dashboard.html # Dashboard │ └── dashboard.html # Dashboard
└── data/ # Auto-generiert beim ersten Start ├── data/ # Datenbank (auto-generiert)
├── watchdog.db # SQLite Datenbank │ └── watchdog.db # SQLite Datenbank
└── watchdog.log # Log-Datei └── logs/ # Log-Dateien (auto-generiert)
├── watchdog.log # Haupt-Log (mit Rotation)
├── error.log # Error-Log (nur Fehler)
└── *.log.* # Rotierte Backups (bis zu 5 pro Typ)
``` ```
## API Endpoints ## API Endpoints
@ -231,13 +236,66 @@ Jede E-Mail enthält:
- IP, MAC, Hostname (bei Geräten) - IP, MAC, Hostname (bei Geräten)
- Detaillierte Beschreibung - Detaillierte Beschreibung
## Logging-System
### Log-Dateien
Das System erstellt separate Log-Dateien im `logs/` Verzeichnis:
| Datei | Inhalt | Log-Level |
|-------|--------|-----------|
| `watchdog.log` | Alle Meldungen (INFO, WARNING, ERROR) | Konfigurierbar |
| `error.log` | Nur Fehler mit vollständigem Traceback | ERROR + |
### Automatische Log-Rotation
- **Maximale Größe:** 10 MB pro Log-Datei
- **Backup-Count:** 5 rotierte Dateien
- **Gesamt:** ~50 MB pro Log-Typ (6 Dateien inkl. aktuellem)
Alte Logs werden automatisch als `.log.1`, `.log.2`, etc. archiviert.
### Log-Level Konfiguration
In `config/config.yaml`:
```yaml
logging:
level: "INFO" # Optionen: DEBUG, INFO, WARNING, ERROR, CRITICAL
```
**Empfohlene Einstellungen:**
- **Produktion:** `INFO` - Normale Betriebsmeldungen
- **Debugging:** `DEBUG` - Detaillierte Informationen für Fehlersuche
- **Minimal:** `WARNING` - Nur Warnungen und Fehler
### Log-Ansicht
```bash
# Aktuelle Logs ansehen
tail -f logs/watchdog.log
# Nur Fehler ansehen
tail -f logs/error.log
# Docker Logs (Container)
docker-compose logs -f watchdog
# Letzte 100 Zeilen
tail -n 100 logs/watchdog.log
```
## Troubleshooting ## Troubleshooting
### Container startet nicht ### Container startet nicht
```bash ```bash
# Logs prüfen # Container Logs prüfen
docker-compose logs docker-compose logs -f
# Lokale Log-Dateien prüfen
tail -f logs/watchdog.log
tail -f logs/error.log
# Container Status # Container Status
docker-compose ps docker-compose ps
@ -293,6 +351,11 @@ docker-compose ps
logging: logging:
level: "DEBUG" level: "DEBUG"
``` ```
Danach Container neu starten und Logs prüfen:
```bash
docker-compose restart
tail -f logs/watchdog.log
```
## Update ## Update

View File

@ -1 +1 @@
0.1.0 0.1.1

View File

@ -20,14 +20,49 @@ with open('config/config.yaml', 'r') as f:
config = yaml.safe_load(f) config = yaml.safe_load(f)
# Setup logging # Setup logging
logging.basicConfig( from logging.handlers import RotatingFileHandler
level=getattr(logging, config['logging']['level']), import os
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[ # Create logs directory if it doesn't exist
logging.FileHandler(config['logging']['file']), logs_dir = os.path.dirname(config['logging']['file'])
logging.StreamHandler() if logs_dir and not os.path.exists(logs_dir):
] os.makedirs(logs_dir, exist_ok=True)
# Main log file with rotation
main_handler = RotatingFileHandler(
config['logging']['file'],
maxBytes=config['logging'].get('max_bytes', 10 * 1024 * 1024), # 10MB default
backupCount=config['logging'].get('backup_count', 5)
) )
main_handler.setLevel(getattr(logging, config['logging']['level']))
main_handler.setFormatter(logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
))
# Error log file (separate file for errors only)
error_handler = RotatingFileHandler(
config['logging']['error_file'],
maxBytes=config['logging'].get('max_bytes', 10 * 1024 * 1024),
backupCount=config['logging'].get('backup_count', 5)
)
error_handler.setLevel(logging.ERROR)
error_handler.setFormatter(logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s - [%(pathname)s:%(lineno)d]'
))
# Console handler
console_handler = logging.StreamHandler()
console_handler.setLevel(getattr(logging, config['logging']['level']))
console_handler.setFormatter(logging.Formatter(
'%(asctime)s - %(levelname)s - %(message)s'
))
# Configure root logger
logging.basicConfig(
level=logging.DEBUG, # Capture everything, handlers filter
handlers=[main_handler, error_handler, console_handler]
)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Initialize Flask # Initialize Flask

View File

@ -56,7 +56,16 @@ database:
path: "/app/data/watchdog.db" path: "/app/data/watchdog.db"
retention_days: 90 # Keep events for 90 days retention_days: 90 # Keep events for 90 days
# Logging # Logging Configuration
logging: logging:
level: "INFO" # DEBUG, INFO, WARNING, ERROR level: "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL
file: "/app/data/watchdog.log"
# Main log file (all messages)
file: "/app/logs/watchdog.log"
# Error log file (errors only with full traceback)
error_file: "/app/logs/error.log"
# Log rotation settings
max_bytes: 10485760 # 10MB per log file
backup_count: 5 # Keep 5 backup files (total ~50MB per log type)

View File

@ -10,6 +10,7 @@ services:
volumes: volumes:
- ./config/config.yaml:/app/config/config.yaml:ro - ./config/config.yaml:/app/config/config.yaml:ro
- ./data:/app/data - ./data:/app/data
- ./logs:/app/logs
environment: environment:
- TZ=Europe/Berlin - TZ=Europe/Berlin
- PYTHONUNBUFFERED=1 - PYTHONUNBUFFERED=1

0
logs/.gitkeep Normal file
View File