【问题标题】:Ruby on Rails log4r and rabbitMQ Custom OutputterRuby on Rails log4r 和 rabbitMQ 自定义输出器
【发布时间】:2013-06-24 14:43:58
【问题描述】:

我正在尝试创建一个使用消息队列远程记录的自定义输出器... 我在 log4r 项目中找到了一个输出器并尝试对其进行修改......但我很烂......所以可能有更好的方法来做到这一点。即:一个有效的。 ;)

在这里,我使用修改后的初始化器和写入方法创建了我的重复输出器。

/lib/rabbit_outputter.rb

require 'log4r'
require 'bunny'

class RabbitOutputter < Log4r::Outputter
  attr_reader :host, :port
  attr_accessor :udpsock
  @exchange = "test1"

  def initialize(_name, hash={})
   super(_name, hash)

   bunny = Bunny.new
   bunny.start
   q = bunny.queue(@exchange)
   @e = bunny.exchange("")
   @e.publish("BOOSH!", :key => @exchange)
   #uncomment this later... b.stop

  end

  #######
  private
  #######

  def write(data)  
    @e.publish(data, :key => @exchange)
  end

end

然后我将它混合到我的 Rails 初始化程序中。 /config/initializers/rabbit_outputter.rb

require "#{Rails.root}/lib/rabbit_outputter.rb"

然后我在我的 log4r.yaml 文件中换掉我的 log4r 记录器

/config/log4r.yaml

log4r_config:
  loggers:
    - name : development
      level : DEBUG
      additive : 'false'
      trace : 'true'
      outputters:
      - rabbit_outputter
    - name : test
      level : DEBUG
      additive : 'false'
      trace : 'true'
      outputters:
      - rabbit_outputter
    - name : staging
      level : INFO
      additive : 'false'
      trace : 'true'
      outputters:
      - rabbit_outputter
    - name : production
      level : INFO
      additive : 'false'
      trace : 'true'
      outputters:
      - rabbit_outputter
  outputters:
    - type : RabbitOutputter
      name : rabbit_outputter
      level : INFO
      filename : <%= "#{Rails.root}/log/#{Rails.env}.log" %>
      formatter:
        date_pattern: '%Y-%m-%d %H:%M:%S %z'
        pattern : '{ \"date\":\"%d\", \"level\":\"%l\", \"appname\":\"MyApp\", \"event fullname\": \"%C\", \"global_diagnostic_context\":\"%g\",\"trace\":\"%t\", \"message\": %m }'
        type : PatternFormatter

这是我打开 Rails 控制台时的错误:

rails c
/Users/<myusername>/.rvm/gems/ruby-1.9.3-p392/gems/log4r-1.1.10/lib/log4r/yamlconfigurator.rb:68:in `block in decode_yaml': 
Problem creating outputter: uninitialized constant Log4r::RabbitOutputter (Log4r::ConfigError)

【问题讨论】:

    标签: ruby-on-rails rabbitmq log4r


    【解决方案1】:

    我遇到了同样的问题,并且能够通过将以下代码放在我的 application.rb 顶部,在我的 Bundler.require 语句之后来解决它:

    require 'log4r'
    require 'log4r/yamlconfigurator'
    require "#{Rails.root}/lib/rollable_file_outputter.rb"
    include Log4r
    

    然后,在 Application 类块的底部,添加这个并使用动态记录器:

    # Assign log4r's logger as Rails' logger.
    log4r_config= YAML.load_file(File.join(File.dirname(__FILE__),"../log4r.yml"))
    YamlConfigurator.decode_yaml( log4r_config['log4r_config'] )
    Server::Application::config.logger = Log4r::Logger[Rails.env]
    

    然后我可以在我的config/log4r.yml 文件中使用type: RollableFileOutputter

    我尝试将所有这些放入单个初始化程序 (config/initializers/logging.rb),但默认记录器不是 log4r,只是标准的 rails 记录器。我真的不明白为什么。

    【讨论】:

    • 这让我找到了解决我遇到的另一个问题的方法。只有在 application.rb 中添加 require 'log4r/emailoutputter' 时,才能在 XML 配置中使用 EmailOutputter
    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多