3.0 KiB
3.0 KiB
Router Mode Guide
Router mode enables multiple pipelines to share HTTP ports through path-based routing.
Overview
Standard mode: Each pipeline needs its own port
- Pipeline 1:
http://localhost:8080/stream - Pipeline 2:
http://localhost:8081/stream
Router mode: Pipelines share ports via paths
- Pipeline 1:
http://localhost:8080/app/stream - Pipeline 2:
http://localhost:8080/database/stream - Global status:
http://localhost:8080/status
Enabling Router Mode
logwisp --router --config /etc/logwisp/multi-pipeline.toml
Configuration
# All pipelines can use the same port
[[pipelines]]
name = "app"
[[pipelines.sources]]
type = "directory"
options = { path = "/var/log/app", pattern = "*.log" }
[[pipelines.sinks]]
type = "http"
options = { port = 8080 } # Same port OK
[[pipelines]]
name = "database"
[[pipelines.sources]]
type = "directory"
options = { path = "/var/log/postgresql", pattern = "*.log" }
[[pipelines.sinks]]
type = "http"
options = { port = 8080 } # Shared port
Path Structure
Paths are prefixed with pipeline name:
| Pipeline | Config Path | Router Path |
|---|---|---|
app |
/stream |
/app/stream |
app |
/status |
/app/status |
database |
/stream |
/database/stream |
Custom Paths
[[pipelines.sinks]]
type = "http"
options = {
stream_path = "/logs", # Becomes /app/logs
status_path = "/health" # Becomes /app/health
}
Endpoints
Pipeline Endpoints
# SSE stream
curl -N http://localhost:8080/app/stream
# Pipeline status
curl http://localhost:8080/database/status
Global Status
curl http://localhost:8080/status
Returns:
{
"service": "LogWisp Router",
"pipelines": {
"app": { /* stats */ },
"database": { /* stats */ }
},
"total_pipelines": 2
}
Use Cases
Microservices
[[pipelines]]
name = "frontend"
[[pipelines.sources]]
type = "directory"
options = { path = "/var/log/frontend", pattern = "*.log" }
[[pipelines.sinks]]
type = "http"
options = { port = 8080 }
[[pipelines]]
name = "backend"
[[pipelines.sources]]
type = "directory"
options = { path = "/var/log/backend", pattern = "*.log" }
[[pipelines.sinks]]
type = "http"
options = { port = 8080 }
# Access:
# http://localhost:8080/frontend/stream
# http://localhost:8080/backend/stream
Environment-Based
[[pipelines]]
name = "prod"
[[pipelines.filters]]
type = "include"
patterns = ["ERROR", "WARN"]
[[pipelines.sinks]]
type = "http"
options = { port = 8080 }
[[pipelines]]
name = "dev"
# No filters - all logs
[[pipelines.sinks]]
type = "http"
options = { port = 8080 }
Limitations
- HTTP Only: Router mode only works for HTTP/SSE
- No TCP Routing: TCP remains on separate ports
- Path Conflicts: Pipeline names must be unique
Load Balancer Integration
upstream logwisp {
server logwisp1:8080;
server logwisp2:8080;
}
location /logs/ {
proxy_pass http://logwisp/;
proxy_buffering off;
}