Skip to content

Commit 5628362

Browse files
authored
Merge pull request rails#51125 from c960657/log-outputs-to-filename
Support filenames in `Logger.logger_outputs_to?`
2 parents de13960 + d518457 commit 5628362

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

activesupport/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
* Add filename support for `Logger.logger_outputs_to?`
2+
3+
```ruby
4+
Logger.logger_outputs_to?('/var/log/rails.log')
5+
```
6+
7+
*Christian Schmidt*
8+
19
* Include `IPAddr#prefix` when serializing an `IPAddr` using the
210
`ActiveSupport::MessagePack` serializer. This change is backward and forward
311
compatible — old payloads can still be read, and new payloads will be

activesupport/lib/active_support/logger.rb

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ class Logger < ::Logger
1313
# logger = Logger.new(STDOUT)
1414
# ActiveSupport::Logger.logger_outputs_to?(logger, STDOUT)
1515
# # => true
16+
#
17+
# logger = Logger.new('/var/log/rails.log')
18+
# ActiveSupport::Logger.logger_outputs_to?('var/log/rails.log', STDOUT)
19+
# # => true
1620
def self.logger_outputs_to?(logger, *sources)
1721
loggers = if logger.is_a?(BroadcastLogger)
1822
logger.broadcasts
@@ -21,9 +25,9 @@ def self.logger_outputs_to?(logger, *sources)
2125
end
2226

2327
logdevs = loggers.map { |logger| logger.instance_variable_get(:@logdev) }
24-
logger_sources = logdevs.filter_map { |logdev| logdev.dev if logdev.respond_to?(:dev) }
28+
logger_sources = logdevs.filter_map { |logdev| logdev.try(:filename) || logdev.try(:dev) }
2529

26-
sources.intersect?(logger_sources)
30+
normalize_sources(sources).intersect?(normalize_sources(logger_sources))
2731
end
2832

2933
def initialize(*args, **kwargs)
@@ -38,5 +42,14 @@ def call(severity, timestamp, progname, msg)
3842
"#{String === msg ? msg : msg.inspect}\n"
3943
end
4044
end
45+
46+
private
47+
def self.normalize_sources(sources)
48+
sources.map do |source|
49+
source = source.path if source.respond_to?(:path)
50+
source = File.realpath(source) if source.is_a?(String) && File.exist?(source)
51+
source
52+
end
53+
end
4154
end
4255
end

activesupport/test/logger_test.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def test_log_outputs_to
2626

2727
assert_not Logger.logger_outputs_to?(@logger, STDOUT), "Expected logger_outputs_to? to STDOUT to return false, but was true"
2828
assert_not Logger.logger_outputs_to?(@logger, STDOUT, STDERR), "Expected logger_outputs_to? to STDOUT or STDERR to return false, but was true"
29+
assert_not Logger.logger_outputs_to?(@logger, "log/production.log")
2930
end
3031

3132
def test_log_outputs_to_with_a_broadcast_logger
@@ -38,6 +39,20 @@ def test_log_outputs_to_with_a_broadcast_logger
3839
assert(Logger.logger_outputs_to?(logger, STDERR))
3940
end
4041

42+
def test_log_outputs_to_with_a_filename
43+
t = Tempfile.new ["development", "log"]
44+
logger = ActiveSupport::BroadcastLogger.new(Logger.new(t.path))
45+
46+
assert Logger.logger_outputs_to?(logger, t)
47+
assert Logger.logger_outputs_to?(logger, t.path)
48+
assert Logger.logger_outputs_to?(logger, File.join(File.dirname(t.path), ".", File.basename(t.path)))
49+
assert_not Logger.logger_outputs_to?(logger, "log/production.log")
50+
assert_not Logger.logger_outputs_to?(logger, STDOUT)
51+
ensure
52+
logger.close
53+
t.close true
54+
end
55+
4156
def test_write_binary_data_to_existing_file
4257
t = Tempfile.new ["development", "log"]
4358
t.binmode

0 commit comments

Comments
 (0)