我正在尝试创建一个使用消息队列远程记录的自定义输出器... 我在log4r项目中找到了一个输出器并尝试修改它...但我很糟糕......所以有可能采用更好的方法来做到这一点。即:一个有效的。 ;)
在这里,我使用修改过的inatializer和write方法创建了我的重复输出器。
/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/initalizers/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)
答案 0 :(得分:1)
我有同样的问题,并且能够通过在我的Bundler.require语句之后将以下代码放在application.rb的顶部来解决它:
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]
然后我可以在type: RollableFileOutputter
文件中使用config/log4r.yml
。
我尝试将所有这些放入一个初始值设定项(config/initializers/logging.rb
),但是默认记录器不是log4r,只是标准的rails记录器。我真的不明白为什么。