292 lines
5.2 KiB
Markdown
292 lines
5.2 KiB
Markdown
# Configuration Guide
|
|
|
|
LogWisp uses TOML format with a flexible **source → filter → sink** pipeline architecture.
|
|
|
|
## Configuration File Location
|
|
|
|
1. Command line: `--config /path/to/config.toml`
|
|
2. Environment: `$LOGWISP_CONFIG_FILE`
|
|
3. User config: `~/.config/logwisp.toml`
|
|
4. Current directory: `./logwisp.toml`
|
|
|
|
## Configuration Structure
|
|
|
|
```toml
|
|
# Optional: LogWisp's own logging
|
|
[logging]
|
|
output = "stderr"
|
|
level = "info"
|
|
|
|
# Required: At least one pipeline
|
|
[[pipelines]]
|
|
name = "default"
|
|
|
|
# Sources (required)
|
|
[[pipelines.sources]]
|
|
type = "directory"
|
|
options = { ... }
|
|
|
|
# Filters (optional)
|
|
[[pipelines.filters]]
|
|
type = "include"
|
|
patterns = [...]
|
|
|
|
# Sinks (required)
|
|
[[pipelines.sinks]]
|
|
type = "http"
|
|
options = { ... }
|
|
```
|
|
|
|
## Logging Configuration
|
|
|
|
Controls LogWisp's operational logging:
|
|
|
|
```toml
|
|
[logging]
|
|
output = "stderr" # file, stdout, stderr, both, none
|
|
level = "info" # debug, info, warn, error
|
|
|
|
[logging.file]
|
|
directory = "./logs"
|
|
name = "logwisp"
|
|
max_size_mb = 100
|
|
max_total_size_mb = 1000
|
|
retention_hours = 168
|
|
|
|
[logging.console]
|
|
target = "stderr" # stdout, stderr, split
|
|
format = "txt" # txt or json
|
|
```
|
|
|
|
## Pipeline Configuration
|
|
|
|
Each `[[pipelines]]` section defines an independent processing pipeline.
|
|
|
|
### Sources
|
|
|
|
Input data sources:
|
|
|
|
#### Directory Source
|
|
```toml
|
|
[[pipelines.sources]]
|
|
type = "directory"
|
|
options = {
|
|
path = "/var/log/myapp", # Directory to monitor
|
|
pattern = "*.log", # File pattern (glob)
|
|
check_interval_ms = 100 # Check interval (10-60000)
|
|
}
|
|
```
|
|
|
|
#### File Source
|
|
```toml
|
|
[[pipelines.sources]]
|
|
type = "file"
|
|
options = {
|
|
path = "/var/log/app.log" # Specific file
|
|
}
|
|
```
|
|
|
|
#### Stdin Source
|
|
```toml
|
|
[[pipelines.sources]]
|
|
type = "stdin"
|
|
options = {}
|
|
```
|
|
|
|
### Filters
|
|
|
|
Control which log entries pass through:
|
|
|
|
```toml
|
|
# Include filter - only matching logs pass
|
|
[[pipelines.filters]]
|
|
type = "include"
|
|
logic = "or" # or: match any, and: match all
|
|
patterns = [
|
|
"ERROR",
|
|
"(?i)warn", # Case-insensitive
|
|
"\\bfatal\\b" # Word boundary
|
|
]
|
|
|
|
# Exclude filter - matching logs are dropped
|
|
[[pipelines.filters]]
|
|
type = "exclude"
|
|
patterns = ["DEBUG", "health-check"]
|
|
```
|
|
|
|
### Sinks
|
|
|
|
Output destinations:
|
|
|
|
#### HTTP Sink (SSE)
|
|
```toml
|
|
[[pipelines.sinks]]
|
|
type = "http"
|
|
options = {
|
|
port = 8080,
|
|
buffer_size = 1000,
|
|
stream_path = "/stream",
|
|
status_path = "/status",
|
|
|
|
# Heartbeat
|
|
heartbeat = {
|
|
enabled = true,
|
|
interval_seconds = 30,
|
|
format = "comment", # comment or json
|
|
include_timestamp = true
|
|
},
|
|
|
|
# Rate limiting
|
|
rate_limit = {
|
|
enabled = true,
|
|
requests_per_second = 10.0,
|
|
burst_size = 20,
|
|
limit_by = "ip", # ip or global
|
|
max_connections_per_ip = 5
|
|
}
|
|
}
|
|
```
|
|
|
|
#### TCP Sink
|
|
```toml
|
|
[[pipelines.sinks]]
|
|
type = "tcp"
|
|
options = {
|
|
port = 9090,
|
|
buffer_size = 5000,
|
|
heartbeat = { enabled = true, interval_seconds = 60 },
|
|
rate_limit = { enabled = true, requests_per_second = 5.0 }
|
|
}
|
|
```
|
|
|
|
#### File Sink
|
|
```toml
|
|
[[pipelines.sinks]]
|
|
type = "file"
|
|
options = {
|
|
directory = "/var/log/logwisp",
|
|
name = "app",
|
|
max_size_mb = 100,
|
|
retention_hours = 168.0,
|
|
buffer_size = 2000
|
|
}
|
|
```
|
|
|
|
#### Console Sinks
|
|
```toml
|
|
[[pipelines.sinks]]
|
|
type = "stdout" # or "stderr"
|
|
options = { buffer_size = 500 }
|
|
```
|
|
|
|
## Complete Examples
|
|
|
|
### Basic Application Monitoring
|
|
|
|
```toml
|
|
[[pipelines]]
|
|
name = "app"
|
|
|
|
[[pipelines.sources]]
|
|
type = "directory"
|
|
options = { path = "/var/log/app", pattern = "*.log" }
|
|
|
|
[[pipelines.sinks]]
|
|
type = "http"
|
|
options = { port = 8080 }
|
|
```
|
|
|
|
### Production with Filtering
|
|
|
|
```toml
|
|
[logging]
|
|
output = "file"
|
|
level = "info"
|
|
|
|
[[pipelines]]
|
|
name = "production"
|
|
|
|
[[pipelines.sources]]
|
|
type = "directory"
|
|
options = { path = "/var/log/app", pattern = "*.log", check_interval_ms = 50 }
|
|
|
|
[[pipelines.filters]]
|
|
type = "include"
|
|
patterns = ["ERROR", "WARN", "CRITICAL"]
|
|
|
|
[[pipelines.filters]]
|
|
type = "exclude"
|
|
patterns = ["/health", "/metrics"]
|
|
|
|
[[pipelines.sinks]]
|
|
type = "http"
|
|
options = {
|
|
port = 8080,
|
|
rate_limit = { enabled = true, requests_per_second = 25.0 }
|
|
}
|
|
|
|
[[pipelines.sinks]]
|
|
type = "file"
|
|
options = { directory = "/var/log/archive", name = "errors" }
|
|
```
|
|
|
|
### Multi-Source Aggregation
|
|
|
|
```toml
|
|
[[pipelines]]
|
|
name = "aggregated"
|
|
|
|
[[pipelines.sources]]
|
|
type = "directory"
|
|
options = { path = "/var/log/nginx", pattern = "*.log" }
|
|
|
|
[[pipelines.sources]]
|
|
type = "directory"
|
|
options = { path = "/var/log/app", pattern = "*.log" }
|
|
|
|
[[pipelines.sources]]
|
|
type = "stdin"
|
|
options = {}
|
|
|
|
[[pipelines.sinks]]
|
|
type = "tcp"
|
|
options = { port = 9090 }
|
|
```
|
|
|
|
### Router Mode
|
|
|
|
```toml
|
|
# Run with: logwisp --router
|
|
|
|
[[pipelines]]
|
|
name = "api"
|
|
[[pipelines.sources]]
|
|
type = "directory"
|
|
options = { path = "/var/log/api", pattern = "*.log" }
|
|
[[pipelines.sinks]]
|
|
type = "http"
|
|
options = { port = 8080 } # Same port OK in router mode
|
|
|
|
[[pipelines]]
|
|
name = "web"
|
|
[[pipelines.sources]]
|
|
type = "directory"
|
|
options = { path = "/var/log/nginx", pattern = "*.log" }
|
|
[[pipelines.sinks]]
|
|
type = "http"
|
|
options = { port = 8080 } # Shared port
|
|
|
|
# Access:
|
|
# http://localhost:8080/api/stream
|
|
# http://localhost:8080/web/stream
|
|
# http://localhost:8080/status
|
|
```
|
|
|
|
## Validation
|
|
|
|
LogWisp validates on startup:
|
|
- Required fields (name, sources, sinks)
|
|
- Port conflicts between pipelines
|
|
- Pattern syntax
|
|
- Path accessibility
|
|
- Rate limit values |