rails 4 log4r server.rb:78:in `start': неопределенный метод `formatter'

Я изучаю эту тему слишком долго, поэтому я должен опубликовать это. У меня есть несколько приложений, использующих эту настройку, и одно из них полностью не работает при запуске rails (rails s). Они оба настроены почти одинаково, но я не могу найти здесь иголку в стоге сена. У кого-нибудь есть какие-либо указатели на то, как найти эту проблему?

настройка на основе: http://blog.mmlac.com/log4r-for-rails/comment-page-1/#comment-1731

когда я пытаюсь запустить rails s:

=> Booting WEBrick
=> Rails 4.0.0 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Exiting
/Users/chrishough/Placewise/code/ApiDigest/.bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/commands/server.rb:78:in `start': undefined method `formatter' for #<Log4r::Logger:0x007f85be89abe8> (NoMethodError)
    from /Users/chrishough/Placewise/code/ApiDigest/.bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/commands.rb:78:in `block in <top (required)>'
    from /Users/chrishough/Placewise/code/ApiDigest/.bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/commands.rb:73:in `tap'
    from /Users/chrishough/Placewise/code/ApiDigest/.bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/commands.rb:73:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

как я настроил log4r в моем файле application.rb:

#log4r requirements
require 'log4r'
require 'log4r/yamlconfigurator'
require 'log4r/outputter/datefileoutputter'
include Log4r

module DigestApi
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

   # -----------------------------------------------------------------------------------
    # assign log4r's logger as rails' logger.
    log4r_config= YAML.load_file(File.join(File.dirname(__FILE__),"log4r.yml"))
    log_cfg = YamlConfigurator
    log_cfg["ENV"] = Rails.env 
    log_cfg.decode_yaml(log4r_config['log4r_config'])

    # # disable standard Rails logging
    config.logger = Log4r::Logger['rails']
    ActiveRecord::Base.logger = Log4r::Logger['sqlserver']

    # #nice for multiple-instance webservers like unicorn
    # #to monitor (re-)starts
    # #log whenever a worker (re-)started
    Log4r::Logger['rails'].info "LAUNCH PUMA WORKER"
    # -----------------------------------------------------------------------------------

Мой файл log4r.yml:

log4r_config:
  # define all loggers:
  loggers:
    - name          : rails
      level         : DEBUG
      trace         : 'true'
      outputters    :
      - console
      - rails_file

    - name          : sqlserver
      level         : DEBUG
      trace         : 'false'
      outputters    :
      - sqlserver_file

    - name          : sqlserver_long_query
      level         : DEBUG
      trace         : 'false'
      outputters    :
      - sqlserver_long_query_file

    - name          : missing_route
      level         : DEBUG
      trace         : 'false'
      outputters    :
      - missing_route_file

  # define all outputters (incl. formatters)
  outputters:
  - type: StdoutOutputter
    name: console
    formatter:
      date_pattern: '%H:%M:%S'
      pattern     : '%d %l: %m'
      type        : PatternFormatter

  - type: FileOutputter
    name: rails_file
    filename: "log/#{ENV}.log"
    trunc: false
    formatter:
      date_pattern: '%Y %m %d %H:%M:%S.%L %z'
      pattern     : '%d %l: %m'
      type        : PatternFormatter

  - type: FileOutputter
    name: sqlserver_file
    filename: "log/sql.log"
    trunc: false
    formatter:
      date_pattern: '%Y %m %d %H:%M:%S.%L %z'
      pattern     : '%d %l: %m'
      type        : PatternFormatter

  - type: FileOutputter
    name: sqlserver_long_query_file
    filename: "log/sql_qry_long.log"
    trunc: false
    formatter:
      date_pattern: '%Y %m %d %H:%M:%S.%L %z'
      pattern     : '%d %l: %m'
      type        : PatternFormatter

  - type: FileOutputter
    name: missing_route_file
    filename: "log/missing_route.log"
    trunc: false
    formatter:
      date_pattern: '%Y %m %d %H:%M:%S.%L %z'
      pattern     : '%d %l: %m'
      type        : PatternFormatter

person Chris Hough    schedule 25.10.2013    source источник


Ответы (3)


Глядя на этот пост [1], вам, возможно, придется также импортировать FileOutputter. Не уверен.

Я думаю, что это проблема импорта, когда другой сервер работает нормально. Просто попробуйте импортировать все, что вы можете использовать, из Log4r и убедитесь, что вы не вызываете упомянутые функции [1] непосредственно в регистраторе где-то еще.

Если это не сработает, попробуйте программно настроить простой регистратор, затем переместите этот регистратор в .yml, а затем расширьте его до того места, где он был раньше.

Надеюсь, это поможет вам, дайте мне знать, если вам нужна дополнительная помощь

[1] Формат неопределенного метода для Log4r в RAILS 4.0

person mmlac    schedule 25.10.2013
comment
Вы имеете в виду использование другого оператора require? т. е. требуется 'log4r/outputter/fileoutputter' - person Chris Hough; 25.10.2013
comment
точно. Попробуйте импортировать каждый класс, который используется в yml, попробуйте изменить его отступ, если возникла ошибка. Если он все еще ломается, начните с нуля с помощью самого простого регистратора, определяемого кодом, затем пройдите свой путь вверх и посмотрите, сломается ли он снова и когда. - person mmlac; 25.10.2013
comment
да, я все перепробовал, все равно почему-то ломается. Я точно слежу за вашим сообщением в блоге, и независимо от того, что я делаю, оно продолжает взрываться в этом приложении. Любые другие идеи? - person Chris Hough; 25.10.2013
comment
хорошо, думаю, я нашел проблему... В новом приложении у нас есть гем, который использует Rails::Logger, тогда как другое приложение использует только Log4r::Logger. Есть ли способ сопоставить Rails:Logger с Log4r:Logger? - person Chris Hough; 25.10.2013
comment
Хм, это странно. Итак, гем ожидает, что регистратор будет типа Rails::Logger и выполняет на нем функции? Я не вижу простого способа решить эту проблему, кроме как дать этому гему исходный регистратор другими способами / разветвить драгоценный камень и раскомментировать оскорбительные строки (вы все равно форматируете журналы самостоятельно). Может быть, драгоценный камень позволяет программно настроить регистратор? - person mmlac; 25.10.2013
comment
Вывод: мы использовали драгоценный камень с синтаксисом Rails.logger, который вызывал эту ошибку. Вместо этого регистраторы Log4r должны использовать синтаксис Log4r.logger. Мы работаем над тем, чтобы исправить это сейчас. Также обратите внимание, что Log4r не работает на Heroku на момент написания этой статьи. - person Chris Hough; 26.10.2013
comment
Не могли бы вы уточнить, почему Log4r в настоящее время не работает с героку? - person mmlac; 26.10.2013

Я столкнулся с той же проблемой, поэтому я создал инициализатор для расширения log4r с помощью пустого метода форматирования. Просто создайте файл с именем log_formatting.rb в инициализаторах и вставьте в него следующее:

class Log4r::Logger
  def formatter()
  end
end

Это сработало для меня. Я надеюсь, что это помогает.

person Cheese Widget    schedule 22.11.2013
comment
Затем добавьте require "log_formatting"? У меня все та же проблема - person Gank; 19.03.2014
comment
поместите его в каталог инициализаторов вашего проекта - person Cheese Widget; 19.05.2014
comment
Это полностью отключило ведение журнала для моего проекта. Мой сервер работает, но журналы не создаются. - person Brad Rice; 13.05.2015

Другим возможным может быть просмотр вашего файла environment.rb, если вы случайно прокомментировали/удалили следующие строки.

require_relative 'application'
Rails.application.initialize!
person Hussain Akram    schedule 24.01.2018