### Development setup with colorized output
Source: https://hanakai.org/learn/dry/dry-logger/v1.2/examples
Configures a logger with a custom colorized template for maximum readability during development.
```ruby
require "dry/logger"
# Register a custom colorized template
Dry::Logger.register_template(
:dev,
"% [%s] " \
"%s %s %s"
)
logger = Dry.Logger(:my_app,
template: :dev,
level: :debug
)
logger.info("Server ready", port: 3000, env: "development")
# (colorized output) 2023-10-15 14:40:00 [my_app] INFO Server ready port=3000 env="development"
```
--------------------------------
### Hybrid logging setup with multiple backends
Source: https://hanakai.org/learn/dry/dry-logger/v1.2/examples
Demonstrates configuring multiple backends for a single logger instance, including colorized console output for development, detailed file logs, JSON logs for analysis, and a dedicated error log file.
```ruby
require "dry/logger"
logger = Dry.Logger(:my_app) do |setup|
# Colorized console for development
setup.add_backend(
stream: $stdout,
formatter: :string,
template: "%s %s %s",
log_if: -> (entry) { ENV["RACK_ENV"] == "development" }
)
# Detailed file logs
setup.add_backend(
stream: "logs/app.log",
formatter: :string,
template: :details
)
# JSON for analysis tools
setup.add_backend(
stream: "logs/app.json",
formatter: :json
)
# Separate error file
setup.add_backend(
stream: "logs/errors.log",
formatter: :string,
template: :details,
log_if: :error?
)
end
logger.info("Application started", version: "1.2.3")
# Console: INFO Application started version="1.2.3" (colorized, development only)
# File: [my_app] [INFO] [2023-10-15 14:55:00 +0000] Application started version="1.2.3"
# JSON: {"progname":"my_app","severity":"INFO",...}
```
--------------------------------
### Colorized template example
Source: https://hanakai.org/learn/dry/dry-logger/v1.2/templates
Example of applying multiple colors to different log fields such as progname and severity.
```ruby
logger = Dry.Logger(:my_app,
template: "[%s] [%s] %s"
)
logger.warn("Memory warning", usage: "85%")
# [my_app] [WARN] Memory warning usage="85%"
# (with colored progname and severity)
```
--------------------------------
### Configure dry-logger for multiple environments
Source: https://hanakai.org/learn/dry/dry-logger/v1.2/examples
Uses a setup_logger method to return different logger configurations based on the provided environment string. Includes specific backend setups for production and a StringIO stream for testing to suppress output.
```ruby
require "dry/logger"
def setup_logger(env)
case env
when "development"
Dry.Logger(:my_app,
template: :dev,
colorize: true,
level: :debug
)
when "production"
Dry.Logger(:my_app) do |setup|
setup.add_backend(
stream: "logs/production.json",
formatter: :json,
filters: production_filters
)
setup.add_backend(
stream: "logs/errors.json",
formatter: :json,
filters: production_filters,
log_if: :error?
)
end
when "test"
require "stringio"
Dry.Logger(:my_app,
stream: StringIO.new,
level: :warn # Suppress noise in tests
)
end
end
def production_filters
[:password, :api_key, :secret_token, :ssn, :credit_card_number]
end
logger = setup_logger(ENV.fetch("RACK_ENV", "development"))
```
--------------------------------
### Production setup with JSON logging and filters
Source: https://hanakai.org/learn/dry/dry-logger/v1.2/examples
Configures structured JSON logging with separate error files and sensitive data filtering.
```ruby
require "dry/logger"
PRODUCTION_FILTERS = [
:password,
:api_key,
:secret_token,
:access_token,
:ssn,
:credit_card_number
].freeze
logger = Dry.Logger(:my_app) do |setup|
# Main JSON log file
setup.add_backend(
stream: "logs/production.json",
formatter: :json,
filters: PRODUCTION_FILTERS
)
# Separate error file
setup.add_backend(
stream: "logs/errors.json",
formatter: :json,
filters: PRODUCTION_FILTERS,
log_if: :error?
)
end
logger.info("Request processed",
user_id: 123,
action: "update_profile",
duration_ms: 45,
password: "secret" # Filtered
)
# {"progname":"my_app","severity":"INFO","time":"2023-10-15T14:42:30Z","message":"Request processed","user_id":123,"action":"update_profile","duration_ms":45,"password":"[FILTERED]"}
```
--------------------------------
### Routing logs with multiple conditions
Source: https://hanakai.org/learn/dry/dry-logger/v1.2/backends
Example of routing different types of logs to separate files using multiple backend configurations within a block.
```ruby
logger = Dry.Logger(:my_app) do |setup|
# All logs in detailed format
setup.add_backend(
stream: "logs/all.log",
template: :details
)
# Only errors in JSON format for monitoring tools
setup.add_backend(
stream: "logs/errors.json",
formatter: :json,
log_if: -> (entry) { entry.error? || entry.fatal? }
)
# Only HTTP requests
setup.add_backend(
stream: "logs/requests.log",
formatter: :rack,
log_if: -> (entry) { entry.key?(:verb) && entry.key?(:path) }
)
# Performance logs
setup.add_backend(
stream: "logs/performance.log",
log_if: -> (entry) { entry.key?(:elapsed) }
)
end
```
--------------------------------
### Per-backend templates configuration
Source: https://hanakai.org/learn/dry/dry-logger/v1.2/templates
Configure different templates for specific backends, such as console output versus file logging, within a single logger setup.
```ruby
logger = Dry.Logger(:my_app) do |setup|
# Colorized, detailed output for console
setup.add_backend(
stream: $stdout,
template: "[%s] %s %s %s"
)
# Plain detailed output for file
setup.add_backend(
stream: "logs/app.log",
template: :details
)
# Minimal output for errors file
setup.add_backend(
stream: "logs/errors.log",
template: "%