# ruby/logger v1.6.4 lib/logger/formatter.rb Format "%.1s, [%s #%d] %5s -- %s: %s\n"; lib/logger.rb SEV_LABEL
# ANY is Logger::UNKNOWN, which says nothing of severity, so it reads as no level.
# captured: Ruby Logger 1.6.4 and 1.3.0
I, [2026-10-21T17:18:43.352871 #52515]  INFO -- : v1.6.4 info ⇒ {"rule": "ruby", "level": "info", "name": "", "message": "v1.6.4 info"}
W, [2026-10-21T17:18:43.352886 #52515]  WARN -- : x ⇒ {"rule": "ruby", "level": "warn", "name": "", "message": "x"}
A, [2026-10-21T17:18:43.352891 #52515]   ANY -- : u ⇒ {"rule": "ruby", "level": "info", "leveled": false, "name": "", "message": "u"}
E, [2026-10-21T17:18:43.352895 #52515] ERROR -- app.db: e ⇒ {"rule": "ruby", "level": "error", "name": "app.db", "message": "e"}
D, [2026-10-21T17:18:20.888672 #52309] DEBUG -- : debug message ⇒ {"rule": "ruby", "level": "debug", "name": "", "message": "debug message"}
F, [2026-10-21T17:18:20.888697 #52309] FATAL -- : fatal message ⇒ {"rule": "ruby", "level": "critical", "name": "", "message": "fatal message"}
I, [2026-10-21T17:18:20.888703 #52309]  INFO -- app.db: with progname ⇒ {"rule": "ruby", "level": "info", "name": "app.db", "message": "with progname"}
I, [2026-10-21T17:18:20.888706 #52309]  INFO -- block progname: block msg ⇒ {"rule": "ruby", "level": "info", "name": "block progname", "message": "block msg"}
I, [2026-10-21T17:18:20.888708 #52309]  INFO -- inline_prog: msg ⇒ {"rule": "ruby", "level": "info", "name": "inline_prog", "message": "msg"}
E, [2026-10-21T17:18:20.888714 #52309] ERROR -- app.db: divided by 0 (ZeroDivisionError) ⇒ {"rule": "ruby", "level": "error", "name": "app.db", "message": "divided by 0 (ZeroDivisionError)"}
# Rails production: the same formatter, with TaggedLogging's tags at the start of the message (railties v7.2.0)
# constructed I, [2026-10-21T17:37:35.058029 #84122]  INFO -- : [6c0ac2f2-5d1c-4a6e-9b53-5b0b0e6c1f6a] Started GET "/" for 127.0.0.1 at 2026-10-21 14:03:01 +0000 ⇒ {"rule": "ruby", "level": "info", "name": "", "message": "[6c0ac2f2-5d1c-4a6e-9b53-5b0b0e6c1f6a] Started GET \"/\" for 127.0.0.1 at 2026-10-21 14:03:01 +0000"}
# constructed W, [2026-10-21T17:37:35.058053 #84122]  WARN -- : [6c0ac2f2-5d1c-4a6e-9b53-5b0b0e6c1f6a] Unpermitted parameter: :admin ⇒ {"rule": "ruby", "level": "warn", "name": "", "message": "[6c0ac2f2-5d1c-4a6e-9b53-5b0b0e6c1f6a] Unpermitted parameter: :admin"}
# constructed E, [2026-10-21T17:37:35.058057 #84122] ERROR -- : [6c0ac2f2-5d1c-4a6e-9b53-5b0b0e6c1f6a] ActionController::RoutingError (No route matches [GET] "/x"): ⇒ {"rule": "ruby", "level": "error", "name": "", "message": "[6c0ac2f2-5d1c-4a6e-9b53-5b0b0e6c1f6a] ActionController::RoutingError (No route matches [GET] \"/x\"):"}
# constructed D, [2026-10-21T17:37:35.058064 #84122] DEBUG -- : [6c0ac2f2-5d1c-4a6e-9b53-5b0b0e6c1f6a]   User Load (0.4ms)  SELECT "users".* FROM "users" LIMIT $1  [["LIMIT", 1]] ⇒ {"rule": "ruby", "level": "debug", "name": "", "message": "[6c0ac2f2-5d1c-4a6e-9b53-5b0b0e6c1f6a]   User Load (0.4ms)  SELECT \"users\".* FROM \"users\" LIMIT $1  [[\"LIMIT\", 1]]"}
# a datetime_format of the program's own, and a message holding its own colon
# constructed I, [2026-10-21 05:14:33 #123]  INFO -- acme: Hello Logs! ⇒ {"rule": "ruby", "level": "info", "name": "acme", "message": "Hello Logs!"}
# constructed W, [2026-10-21T17:18:43.352886 #52515]  WARN -- pump: rail: low ⇒ {"rule": "ruby", "level": "warn", "name": "pump", "message": "rail: low"}
# constructed I, [2026-10-21T17:18:43.352886 #52515]  INFO -- pump: rail=13.65V ⇒ {"rule": "ruby+kv", "level": "info", "name": "pump", "message": "rail=13.65V", "values": [["rail", 13.65, "V"]]}
# a logged exception's backtrace, a message's next line, custom formatters, and lines that only look like it
ruby_logger.rb:9:in `<main>' ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "ruby_logger.rb:9:in `<main>'"}
line message ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "line message"}
INFO: custom proc ⇒ {"rule": "level-word", "level": "info", "message": "custom proc"}
2026-10-21 17:18:20 [WARN] custom doc format ⇒ {"rule": "layout", "level": "warn", "message": "custom doc format"}
# constructed I, [2026-10-21T17:18:43.352871]  INFO -- : no pid ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "I, [2026-10-21T17:18:43.352871]  INFO -- : no pid"}
# constructed I, [2026-10-21T17:18:43.352871 #52515]  INFO : no dashes ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "I, [2026-10-21T17:18:43.352871 #52515]  INFO : no dashes"}
# constructed X, [2026-10-21T17:18:43.352871 #52515]  INFO -- : not a severity letter ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "X, [2026-10-21T17:18:43.352871 #52515]  INFO -- : not a severity letter"}
# constructed I, [2026-10-21T17:18:43.352871 #52515]  info -- : lower case ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "I, [2026-10-21T17:18:43.352871 #52515]  info -- : lower case"}
# constructed I, [2026-10-21T17:18:43.352871 #52515]  NOTICE -- : not a Ruby severity ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "I, [2026-10-21T17:18:43.352871 #52515]  NOTICE -- : not a Ruby severity"}
# constructed I, said the pump, [twice] ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "I, said the pump, [twice]"}
