【问题标题】:rails 4 log4r server.rb:78:in `start': undefined method `formatter'rails 4 log4r server.rb:78:in `start': undefined method `formatter'
【发布时间】:2013-10-25 01:20:46
【问题描述】:

我已经研究这个话题太久了,所以我必须发布这个。我有一些应用程序运行此设置,其中一个完全在 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>'

我如何在 application.rb 文件中配置 log4r:

#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

【问题讨论】:

    标签: ruby ruby-on-rails-4 log4r


    【解决方案1】:

    我遇到了同样的问题,所以我创建了一个初始化器来使用一个空的格式化程序方法来扩展 log4r。只需在初始化程序中创建一个名为 log_formatting.rb 的文件并将以下内容粘贴到其中:

    class Log4r::Logger
      def formatter()
      end
    end
    

    这对我有用。希望对你有帮助。

    【讨论】:

    • 然后加require "log_formatting"?我还是一样的问题
    • 把它放在你项目的初始化器目录中
    • 这完全禁用了我的项目的日志记录。让我的服务器运行,但没有创建日志。
    【解决方案2】:

    查看这篇文章 [1],您可能还需要导入 FileOutputter。不太确定。

    我认为当其他服务器工作正常时这是一个导入问题。 只需尝试从 Log4r 导入您可能使用的所有内容,并确保您没有直接在其他地方的记录器上调用 [1] 提到的函数。

    如果这不起作用,请尝试以编程方式设置一个简单的记录器,然后将该记录器移动到 .yml,然后将其展开回原来的位置。

    希望对您有所帮助,如果您需要更多帮助,请告诉我

    [1]Undefined Method Formatter for Log4r in RAILS 4.0

    【讨论】:

    • 您是指使用不同的 require 语句吗?即需要'log4r/outputter/fileoutputter'
    • 完全正确。尝试导入 yml 中使用的每个类,如果出现错误,请尝试重新缩进。如果它仍然使用最简单的代码定义的记录器从头开始中断,那么请继续努力,看看它是否以及何时再次中断
    • 是的,我已经尝试了所有方法,但由于某种原因它仍然无法正常工作。我完全关注您的博客文章,无论我做什么,它都会在这个应用程序上爆炸。还有其他想法吗?
    • 好的,我想我可能找到了问题... 在新应用程序中,我们有一个使用 Rails::Logger 的 gem,而其他应用程序只使用 Log4r::Logger。反正有 Rails:Logger 映射到 Log4r:Logger 吗?
    • 结论:我们使用了一个使用 Rails.logger 语法的 gem,它触发了这个错误。 Log4r 记录器应该使用 Log4r.logger 语法。我们现在正在努力纠正这个问题。另外,请注意,截至本文,Log4r 不适用于 Heroku。
    【解决方案3】:

    如果您不小心评论/删除了以下行,另一种可能是查看您的 environment.rb 文件。

    require_relative 'application'
    Rails.application.initialize!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2013-08-31
      • 1970-01-01
      相关资源
      最近更新 更多