diff --git a/config/logwisp.toml.defaults b/config/logwisp.toml.defaults index 7689a1e..1e664c6 100644 --- a/config/logwisp.toml.defaults +++ b/config/logwisp.toml.defaults @@ -11,6 +11,8 @@ # background = false # Run as background daemon # quiet = false # Suppress all output # disable_status_reporter = false # Disable periodic status logging +# config_auto_reload = false # Auto-reload on config change +# config_save_on_exit = false # Save config on shutdown # ============================================================================ # LOGGING (LogWisp's operational logs) @@ -218,6 +220,14 @@ response_message = "Rate limit exceeded" # issuer = "" # Expected issuer # audience = "" # Expected audience +# ============================================================================ +# HOT RELOAD +# ============================================================================ +# Enable with: --config-auto-reload +# Manual reload: kill -HUP $(pidof logwisp) +# Updates pipelines, filters, formatters without restart +# Logging changes require restart + # ============================================================================ # ROUTER MODE # ============================================================================ @@ -226,6 +236,13 @@ response_message = "Rate limit exceeded" # Access pattern: http://localhost:8080/{pipeline_name}/stream # Global status: http://localhost:8080/status +# ============================================================================ +# SIGNALS +# ============================================================================ +# SIGINT/SIGTERM: Graceful shutdown +# SIGHUP/SIGUSR1: Reload config (when auto-reload enabled) +# SIGKILL: Immediate shutdown + # ============================================================================ # CLI FLAGS # ============================================================================ diff --git a/doc/cli.md b/doc/cli.md index 0711ea6..a57be64 100644 --- a/doc/cli.md +++ b/doc/cli.md @@ -35,6 +35,19 @@ Suppress all output (overrides logging configuration) except sinks. Disable periodic status reporting. - **Example**: `logwisp --disable-status-reporter` +### `--config-auto-reload` +Enable automatic configuration reloading on file changes. +- **Example**: `logwisp --config-auto-reload --config /etc/logwisp/config.toml` +- Monitors configuration file for changes +- Reloads pipelines without restart +- Preserves connections during reload + +### `--config-save-on-exit` +Save current configuration to file on exit. +- **Example**: `logwisp --config-save-on-exit` +- Useful with runtime modifications +- Requires valid config file path + ## Logging Options Override configuration file settings: @@ -172,9 +185,12 @@ logwisp --pipelines.0.name filtered \ - `0`: Success - `1`: General error - `2`: Configuration file not found +- `137`: SIGKILL received ## Signals - `SIGINT` (Ctrl+C): Graceful shutdown - `SIGTERM`: Graceful shutdown +- `SIGHUP`: Reload configuration (when auto-reload enabled) +- `SIGUSR1`: Reload configuration (when auto-reload enabled) - `SIGKILL`: Immediate shutdown (exit code 137) \ No newline at end of file diff --git a/doc/configuration.md b/doc/configuration.md index 162605b..59bdb97 100644 --- a/doc/configuration.md +++ b/doc/configuration.md @@ -20,6 +20,8 @@ LogWisp supports three configuration methods with the following precedence: | Show version | `--version` | `LOGWISP_VERSION` | `version = true` | | Quiet mode | `--quiet` | `LOGWISP_QUIET` | `quiet = true` | | Disable status reporter | `--disable-status-reporter` | `LOGWISP_DISABLE_STATUS_REPORTER` | `disable_status_reporter = true` | +| Config auto-reload | `--config-auto-reload` | `LOGWISP_CONFIG_AUTO_RELOAD` | `config_auto_reload = true` | +| Config save on exit | `--config-save-on-exit` | `LOGWISP_CONFIG_SAVE_ON_EXIT` | `config_save_on_exit = true` | | Config file | `--config ` | `LOGWISP_CONFIG_FILE` | N/A | | Config directory | N/A | `LOGWISP_CONFIG_DIR` | N/A | | **Logging** | @@ -52,6 +54,29 @@ Note: `N` represents array indices (0-based). 3. User config: `~/.config/logwisp/logwisp.toml` 4. Current directory: `./logwisp.toml` +## Hot Reload + +LogWisp supports automatic configuration reloading without restart: + +```bash +# Enable hot reload +logwisp --config-auto-reload --config /etc/logwisp/config.toml + +# Manual reload via signal +kill -HUP $(pidof logwisp) # or SIGUSR1 +``` + +Hot reload updates: +- Pipeline configurations +- Filters +- Formatters +- Rate limits +- Router mode changes + +Not reloaded (requires restart): +- Logging configuration +- Background mode + ## Configuration Structure ```toml @@ -107,6 +132,28 @@ options = { ... } Each `[[pipelines]]` section defines an independent processing pipeline. +### Pipeline Formatters + +Control output format per pipeline: + +```toml +[[pipelines]] +name = "json-output" +format = "json" # raw, json, text + +[pipelines.format_options] +# JSON formatter +pretty = false +timestamp_field = "timestamp" +level_field = "level" +message_field = "message" +source_field = "source" + +# Text formatter +template = "[{{.Timestamp | FmtTime}}] [{{.Level | ToUpper}}] {{.Message}}" +timestamp_format = "2006-01-02T15:04:05Z07:00" +``` + ### Sources Input data sources: @@ -320,6 +367,28 @@ type = "http" options = { port = 8080 } ``` +### Hot Reload with JSON Output + +```toml +config_auto_reload = true +config_save_on_exit = true + +[[pipelines]] +name = "app" +format = "json" + +[pipelines.format_options] +pretty = true + +[[pipelines.sources]] +type = "directory" +options = { path = "/var/log/app", pattern = "*.log" } + +[[pipelines.sinks]] +type = "http" +options = { port = 8080 } +``` + ### Filtering ```toml diff --git a/doc/environment.md b/doc/environment.md index c2413ce..c7dfcf6 100644 --- a/doc/environment.md +++ b/doc/environment.md @@ -15,6 +15,17 @@ Examples: ## General Variables +```bash +LOGWISP_CONFIG_FILE=/etc/logwisp/config.toml +LOGWISP_CONFIG_DIR=/etc/logwisp +LOGWISP_ROUTER=true +LOGWISP_BACKGROUND=true +LOGWISP_QUIET=true +LOGWISP_DISABLE_STATUS_REPORTER=true +LOGWISP_CONFIG_AUTO_RELOAD=true +LOGWISP_CONFIG_SAVE_ON_EXIT=true +``` + ### `LOGWISP_CONFIG_FILE` Configuration file path. ```bash @@ -95,6 +106,19 @@ LOGWISP_PIPELINES_0_SINKS_0_OPTIONS_PORT=8080 LOGWISP_PIPELINES_0_SINKS_0_OPTIONS_BUFFER_SIZE=1000 ``` +### Pipeline with Formatter + +```bash +# Pipeline name and format +LOGWISP_PIPELINES_0_NAME=app +LOGWISP_PIPELINES_0_FORMAT=json + +# Format options +LOGWISP_PIPELINES_0_FORMAT_OPTIONS_PRETTY=true +LOGWISP_PIPELINES_0_FORMAT_OPTIONS_TIMESTAMP_FIELD=ts +LOGWISP_PIPELINES_0_FORMAT_OPTIONS_LEVEL_FIELD=severity +``` + ### Filters ```bash # Include filter