DEV Community

Jeff Dwyer
Jeff Dwyer

Posted on

Tagged Logging vs Structured Logging

Understanding Tagged vs. Structured Logging

What's Tagged Logging?

Tagged logging allows you to prepend tags to your log messages. For instance, using ActiveSupport::TaggedLogging, you can tag logs with "Auth API" or user IDs.

class Permissions
  def get(user)
    logger.tagged("Auth API") do
      uri = URI("https://auth.example.com/permissions/?user=#{user}")

      logger.info { "Fetching #{uri}" }
      permissions = Permissions.parse(Net::HTTP.get(uri))
      logger.info { "Got permissions #{permissions.to_s}" }
    end
  end
end

# Log Output
#[Auth API] Fetching https://auth.example.com/permissions/?user=bob
#[Auth API] Got permissions admin, writer, reader
Enter fullscreen mode Exit fullscreen mode

Pros:

  • Enhances log readability.
  • Avoids repetition by tagging once for multiple log lines.

Cons:

  • Not machine-friendly. While the text version looks good, the JSON format can be confusing, especially when searching for specific tags.

Structured Logging: A Better Alternative?

Structured logging provides a more organized way to log messages. Instead of tagging, you structure your logs with key-value pairs.

Example:

log.info "hello", user: "1", team: "The best team"
Enter fullscreen mode Exit fullscreen mode

Output:

Text Log:
INFO hello user=1, team=The Best Team

JSON Log:
{severity: INFO, message: "hello", user: 1, team: "The Best Team"}
Enter fullscreen mode Exit fullscreen mode

This approach is more machine-readable and fits better with modern log aggregators.

Libraries Supporting Structured Logging:

Note: Lograge offers structured logs for Rails requests but lacks custom structuring.

Why I Wrote This

I'm building a dynamic log library and wanted to understand the best approaches to structured and tagged logging.

In Summary:

  • Tagged logging is user-friendly but not machine-friendly.
  • Structured logging offers a more organized and machine-readable approach.
  • Tagged logging does have nice nesting behavior, though you can achieve that with the semantic logger gem as well.

Top comments (0)