Files
logwisp/doc/router.md

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

  1. HTTP Only: Router mode only works for HTTP/SSE
  2. No TCP Routing: TCP remains on separate ports
  3. 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;
}