The Crystal Programming Language Forum

Log to multiple files

How do I Log to multiple files within the same app (e.g.: log to tmp/Foo.log and tmp/Bar.log)? In the, the following example code, blank file will be created for each of the log files, but all log entries get logged to the last Logger’s file (e.g.: tmp/Bar.log). However, I want the LoggerFoo.*(..) calls to go to the tmp/Foo.log file and the LoggerBar.*(..) calls to go to the tmp/Bar.log file.

require "log"

class LoggerFoo < Log
  setup(:info, Log::IOBackend.new(File.new("tmp/Foo.log", "a+")))
end

class LoggerBar < Log
  setup(:info, Log::IOBackend.new(File.new("tmp/Bar.log", "a+")))
end

i = 0

LoggerFoo.notice { ["notice", i += 1] }
LoggerBar.warn { ["warn",  i += 1] }
LoggerBar.notice { ["notice",  i += 1] }
LoggerFoo.warn { ["warn",  i += 1] }

tmp/Foo.log:


tmp/Bar.log:

2021-10-12T00:31:14.900363Z NOTICE - ["notice", 1]
2021-10-12T00:31:14.900372Z   WARN - ["warn", 2]
2021-10-12T00:31:14.900375Z NOTICE - ["notice", 3]
2021-10-12T00:31:14.900378Z   WARN - ["warn", 4]

Can use a Log::BroadcastBackend - Crystal 1.2.0-dev with 2 Log::IOBackends.

EDIT: You need to create a logger for each source, then bind each source to its related backend. Something like:

FOO_LOGGER = Log.for "foo"
BAR_LOGGER = Log.for "bar"

Log.setup do |c|
  foo_backend = Log::IOBackend.new(File.new("tmp/Foo.log", "a+"))
  bar_backend = Log::IOBackend.new(File.new("tmp/Bar.log", "a+"))

  c.bind "foo.*", :info, foo_backend
  c.bind "bar.*", :info, bar_backend
end
1 Like

@Blacksmoke16 , Thanks! :slight_smile:

Now my example looks like:

require "log"

FOO_LOGGER = Log.for "foo"
BAR_LOGGER = Log.for "bar"

Log.setup do |c|
  foo_backend = Log::IOBackend.new(File.new("tmp/Foo.log", "a+"))
  bar_backend = Log::IOBackend.new(File.new("tmp/Bar.log", "a+"))

  c.bind "foo.*", :info, foo_backend
  c.bind "bar.*", :info, bar_backend
end

i = 0

FOO_LOGGER.notice { ["notice", i += 1] }
BAR_LOGGER.warn { ["warn",  i += 1] }
BAR_LOGGER.notice { ["notice",  i += 1] }
FOO_LOGGER.warn { ["warn",  i += 1] }

And, after clearing my log file contents,

  • the tmp/Foo.log file looks like:
2021-10-12T00:58:43.165283Z NOTICE - foo: ["notice", 1]
2021-10-12T00:58:43.165302Z   WARN - foo: ["warn", 4]

  • the tmp/Bar.log (after I cleared the contents) looks like:
2021-10-12T00:58:43.165294Z   WARN - bar: ["warn", 2]
2021-10-12T00:58:43.165298Z NOTICE - bar: ["notice", 3]

2 posts were split to a new topic: Log Rotation