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
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"
Output:
Text Log: INFO hello user=1, team=The Best Team JSON Log: {severity: INFO, message: "hello", user: 1, team: "The Best Team"}
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)