← Back to Foundation

LOG NOISE FIX

Documentation for LOG_NOISE_FIX from the Foundation repository.

Log Noise Reduction - Jido Action Execution

Problem Fixed ✅

Issue: Jido action execution was generating extremely verbose log messages that were clogging up the logs. Each action execution would log the entire params and context, including huge data structures like task queues with hundreds of items.

Example of problematic log:

[notice] Executing JidoSystem.Actions.QueueTask with params: %{priority: :normal, task: %{id: "overflow_task_943", type: :data_processing, input_data: %{source: "test.csv"}}, delay: 0, queue_name: "default"} and context: %{state: %{status: :processing, max_queue_size: 1000, error_count: 0, processed_count: 0, current_task: nil, task_queue: {[normal: %{id: "overflow_task_942", type: :data_processing, input_data: %{source: "test.csv"}}, normal: %{id: "overflow_task_941", type: :data_processing, input_data: %{source: "test.csv"}}, ...THOUSANDS OF CHARACTERS...

Solution Implemented ✅

Created a Logger Filter that transforms verbose Jido action logs into concise one-liners:

1. Custom Logger Filter (lib/foundation/logger_filter.ex)

  • Detects :notice level logs starting with “Executing”
  • Extracts essential information: action name, task ID, type, priority
  • Transforms to compact format: [ActionName] id:xxx type:yyy prio:zzz

2. Logger Configuration (config/dev.exs)

  • Applied filter to console logger
  • Maintains debug logging for other messages
  • Only transforms verbose action execution logs

Results ✅

Before:

[notice] Executing JidoSystem.Actions.ProcessTask with params: %{task_id: "test_123", task_type: :data_processing, input_data: %{source: "test.csv"}, options: %{retry_attempts: 3, timeout: 30000, priority: :normal, circuit_breaker: false}} and context: %{state: %{status: :processing, max_queue_size: 1000, task_queue: {[normal: %{id: "overflow_task_942"...

After:

[ProcessTask] id:test_123 type:data_processing prio:normal

Implementation Details

Filter Function

def filter(log_event) when is_map(log_event) do
  case log_event do
    %{level: :notice, msg: {:string, "Executing " <> _rest = message}} ->
      compact_message = extract_compact_info(message)
      %{log_event | msg: {:string, compact_message}}
    
    _ ->
      log_event
  end
end

Configuration

# config/dev.exs
config :logger, :console,
  format: "\n$time [$level] $metadata\n$message\n",
  metadata: [:module, :function, :line],
  filters: [
    action_filter: {&Foundation.LoggerFilter.filter/1, %{}}
  ]

Benefits ✅

  1. Dramatically Reduced Log Volume: Multi-KB messages → 30-50 characters
  2. Improved Readability: Easy to scan action execution flow
  3. Essential Info Preserved: Still shows action name, task ID, type, priority
  4. No Information Loss: All other log messages unchanged
  5. Performance: Minimal overhead, only processes action execution logs

Test Verification ✅

# Test case shows successful transformation
Original: {:string, "Executing JidoSystem.Actions.ProcessTask with params: %{task_id: \"test_123\"...
Filtered: {:string, "[ProcessTask] id:test_123"}

The logger filter is now active and will automatically reduce log noise from verbose Jido action executions while preserving all other logging functionality.

Usage

The filter is automatically applied in development environment. No changes needed to existing code. The system will now show compact action logs instead of verbose ones:

  • [ProcessTask] id:abc123 type:data_processing
  • [QueueTask] id:def456 prio:high
  • [ValidateTask] id:ghi789 type:compliance

Instead of thousands of characters of parameter dumps.