【发布时间】:2014-05-09 08:32:22
【问题描述】:
我有一个可用的 Rails 3.2 应用程序(Windows Server 2008 R2 上的 Ruby 1.9.2p290),它使用延迟作业来处理多个后台作业。我最近用 log4r 替换了 Rails 默认日志记录,它在 Rails 应用程序中运行良好。但是,当我启动 rake jobs:work 任务时,我收到一个错误,抱怨 nil 输出器:
还有其他人成功使用 log4r 并延迟作业吗?我可以使用一些指针;无法通过 Google 或 DuckDuckGo 搜索找到任何内容。
这是config/application.rbsn-p:
require File.expand_path('../boot', __FILE__)
require 'erb'
require 'rails/all'
# log4r
require 'log4r'
require 'log4r/yamlconfigurator'
require 'log4r/outputter/datefileoutputter'
require 'log4r/outputter/consoleoutputters'
include Log4r
...
class Application < Rails::Application
...
# assign log4r's logger as rails' logger.
log4r_config = YAML.load(ERB.new(File.read(File.join(File.dirname(__FILE__), 'log4r.yml'))).result)
log4r_config['ENV'] = Rails.env
log4r_config['APPNAME'] = Rails.application.class.parent_name
YamlConfigurator.decode_yaml(log4r_config['log4r_config'])
config.logger = Log4r::Logger[Rails.env]
ActiveRecord::Base.logger = Log4r::Logger[Rails.env]
end
这是config/log4r.yml 文件:
log4r_config:
# define all loggers ...
loggers:
- name: production
level: WARN
trace: 'false'
outputters:
- datefile_production
- console_production
- name: development
level: DEBUG
trace: 'true'
outputters:
- datefile_development
- console_development
- name: test
level: DEBUG
trace: 'true'
outputters:
- datefile_test
- console_test
# define all outputters (incl. formatters)
outputters:
- type: DateFileOutputter
name: datefile_production
dirname: "<%= File.join(Rails.root, 'log') %>"
filename: "production.log"
formatter:
date_pattern: '%H:%M:%S.%L'
pattern: '%p\t%d\t%X{:remote_ip}\t%X{:user}\t%X{:controller}\t%X{:action}\t%l\t%m'
type: PatternFormatter
- type: DateFileOutputter
name: datefile_development
dirname: "<%= File.join(Rails.root, 'log') %>"
filename: "development.log"
formatter:
date_pattern: '%H:%M:%S.%L'
pattern: '%p\t%d\t%X{:remote_ip}\t%X{:user}\t%X{:controller}\t%X{:action}\t%l\t%m'
type: PatternFormatter
- type: DateFileOutputter
name: datefile_test
dirname: "<%= File.join(Rails.root, 'log') %>"
filename: "test.log"
formatter:
date_pattern: '%H:%M:%S.%L'
pattern: '%p\t%d\t%X{:remote_ip}\t%X{:user}\t%X{:controller}\t%X{:action}\t%l\t%m'
type: PatternFormatter
- type: StdoutOutputter
name: console_production
formatter:
date_pattern: '%H:%M:%S.%L'
pattern: '%p\t%d\t%l\t%m'
type: PatternFormatter
- type: StdoutOutputter
name: console_development
formatter:
date_pattern: '%H:%M:%S.%L'
pattern: '%p\t%d\t%X{:remote_ip}\t%X{:user}\t%X{:controller}\t%X{:action}\t%l\t%m'
type: PatternFormatter
- type: StdoutOutputter
name: console_test
formatter:
date_pattern: '%H:%M:%S.%L'
pattern: '%p\t%d\t%X{:remote_ip}\t%X{:user}\t%X{:controller}\t%X{:action}\t%l\t%m'
type: PatternFormatter
更新
嗯,通过调试器运行 rake 任务后,我弄清楚发生了什么。
Delayed::Worker (delayed_job/lib/delayed/worker.rb line 248) 正在通过记录器的 add 方法记录一条消息,如下所示:
logger.add level, "#{Time.now.strftime('%FT%T%z')}: #{text}" if logger
这对于 Ruby 的 Logger 类是有效且正确的,请参阅 Logger.html#method-i-add。但是,通过使用 log4r,它会解析为尝试添加输出器的 Log4r::Logger.add (log4r/lib/log4r/logger.rb line 119)。
我不确定为什么会发生这种情况,或者解决方案是什么。
【问题讨论】:
-
看起来您使用的是 Windows。并且无法创建输出接口。 Check this 并在可行的情况下将其发布为答案。如果没有,请发布您的 Log4r 配置设置,这可能会有所帮助。
标签: ruby ruby-on-rails-3 delayed-job log4r