Как сделать так, чтобы логгер рельсов использовал последовательности ANSI при выводе на экран, но не при входе в файл?
Я был раздражен необходимостью обрезать последовательности ANSI в журнале на рабочем сервере (log/production.log
), поэтому я добавил config.colorize_logging = false
в config/environments/production.rb
, Но теперь, когда я запускаю консоль (bin/rails c
), вывод также не раскрашен. Почему это так? Есть ли способ заставить логгер использовать последовательности ANSI при выводе на экран, а не использовать их при записи в файл?
UPD Что мне удалось выяснить. когда rails
приложение запускается, оно создает logger
войти в файл:
Rails.logger ||= config.logger || begin
path = config.paths["log"].first
unless File.exist? File.dirname path
FileUtils.mkdir_p File.dirname path
end
f = File.open path, 'a'
f.binmode
f.sync = config.autoflush_log # if true make sure every write flushes
logger = ActiveSupport::Logger.new f
logger.formatter = config.log_formatter
logger = ActiveSupport::TaggedLogging.new(logger)
logger
rescue StandardError
logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDERR))
logger.level = ActiveSupport::Logger::WARN
logger.warn(
"Rails Error: Unable to access log file. Please ensure that #{path} exists and is writable " +
"(ie, make it writable for user and group: chmod 0664 #{path}). " +
"The log level has been raised to WARN and the output directed to STDERR until the problem is fixed."
)
logger
end
А затем присоединяет к нему еще один регистратор для вывода сообщений на STDOUT
:
def log_to_stdout
wrapped_app # touch the app so the logger is set up
console = ActiveSupport::Logger.new($stdout)
console.formatter = Rails.logger.formatter
console.level = Rails.logger.level
Rails.logger.extend(ActiveSupport::Logger.broadcast(console))
end
По какой-то причине порвать с byebug
ключевое слово в ActiveSupport::Logger#initialize
никогда не получится, когда я побежал ./bin/rails c
,
UPD Хорошо, виновник был spring
, console
(или я должен сказать activerecord
) создает свой регистратор здесь:
console do |app|
require "active_record/railties/console_sandbox" if app.sandbox?
require "active_record/base"
console = ActiveSupport::Logger.new(STDERR)
Rails.logger.extend ActiveSupport::Logger.broadcast console
end
1 ответ
Один из способов включить colorized_logging в консоли - установить для него значение true следующим образом:
$ bin/rails c
:001 > Rails.application.config.colorize_logging
=> false
:002 > Rails.application.config.colorize_logging = true
=> true
:003 > Rails.application.config.colorize_logging
=> true
Там может быть способ установить это автоматически каждый раз, когда консоль загружается путем настройки консоли с помощью .irbrc
файл