### 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: "%