Как сделать так, чтобы логгер рельсов использовал последовательности 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 файл

Другие вопросы по тегам