1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
require "../spec_helper"
require "log"
private def s(value : Log::Severity)
value
end
private def io_logger(*, stdout : IO, config = nil, source : String = "")
builder = Log::Builder.new
backend = Log::IOBackend.new
backend.io = stdout
builder.bind("*", s(:info), backend)
builder.for(source)
end
describe Log::IOBackend do
it "creates with defaults" do
backend = Log::IOBackend.new
backend.io.should eq(STDOUT)
backend.formatter.should eq(Log::ShortFormat)
backend.dispatcher.should be_a(Log::AsyncDispatcher)
end
it "logs messages" do
IO.pipe do |r, w|
logger = io_logger(stdout: w)
logger.debug { "debug:skip" }
logger.info { "info:show" }
logger.level = s(:debug)
logger.debug { "debug:show" }
logger.level = s(:warn)
logger.debug { "debug:skip:again" }
logger.info { "info:skip" }
logger.error { "error:show" }
r.gets.should match(/info:show/)
r.gets.should match(/debug:show/)
r.gets.should match(/error:show/)
end
end
it "logs context" do
IO.pipe do |r, w|
logger = io_logger(stdout: w)
Log.context.clear
Log.with_context do
Log.context.set foo: "bar"
logger.info { "info:show" }
end
r.gets.should match(/info:show -- foo: "bar"/)
end
end
it "logs any object" do
IO.pipe do |r, w|
logger = io_logger(stdout: w)
logger.info { 12345 }
r.gets.should match(/12345/)
end
end
it "formats message" do
IO.pipe do |r, w|
logger = io_logger(stdout: w, source: "db.pool")
logger.warn { "message" }
r.gets(chomp: false).should match(/.+? WARN - db.pool: message\n/)
end
end
it "uses custom formatter" do
IO.pipe do |r, w|
logger = io_logger(stdout: w)
logger.backend.as(Log::IOBackend).formatter = Log::Formatter.new do |entry, io|
io << entry.severity.to_s[0].upcase << ": " << entry.message
end
logger.warn { "message" }
r.gets(chomp: false).should eq("W: message\n")
end
end
it "allows setting formatter in initializer" do
formatter = Log::Formatter.new { |_entry, io| io }
backend = Log::IOBackend.new(formatter: formatter)
log = Log.new("foo", backend, :info)
log.backend.should eq(backend)
end
it "yields message" do
IO.pipe do |r, w|
logger = io_logger(stdout: w, source: "db")
logger.error { "message" }
logger.fatal { "another message" }
r.gets(chomp: false).should match(/ERROR - db: message\n/)
r.gets(chomp: false).should match(/FATAL - db: another message\n/)
end
end
end
|