7

Tôi không thể đăng nhập thư từ quá trình delay_job của mình. Đây là công việc đang được chạy.delay_job không đăng nhập

class MyJob 
    def initialize(blahblah) 
    @blahblah = blahblah 
    @logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log')) 
    end 
    def perform 
    @logger.add Logger::INFO, "logging from delayed_job" 
    #do stuff 
    end 
end 

Tôi đã thử các mức ghi nhật ký khác nhau và tôi có config.log_level =: debug trong cấu hình môi trường của mình. Tôi chạy delay_job từ monit. Tôi đang sử dụng delay_job 3.0.1 với ruby ​​1.9.3 và đường ray 3.0.10.

+0

Một ý tưởng sẽ được rằng nó là mâu thuẫn vì delayed_job đang sử dụng tập tin đăng nhập này là tốt. Bạn có thử tên khác không? – iltempo

+0

Tôi đã thử một tên khác. Tệp nhật ký mới được tạo nhưng không có gì được ghi vào nó. – freedrull

Trả lời

16

Việc giải thích có thể là công việc chỉ được khởi tạo một lần ở phía nhà sản xuất. Sau đó, nó được serialized, phân phối thông qua hàng đợi (cơ sở dữ liệu ví dụ) và unserialized trong công nhân. Nhưng phương thức khởi tạo lại không được gọi lại trong tiến trình công nhân. Chỉ có phương thức thực hiện được gọi qua gửi.

Tuy nhiên bạn có thể tái sử dụng người lao động logger ghi vào log file:

class MyJob 
    def perform 
    say "performing like hell" 
    end 

    def say(text) 
    Delayed::Worker.logger.add(Logger::INFO, text) 
    end 
end 

Đừng quên khởi động lại công nhân.

+0

Phương pháp này hiệu quả với tôi. Cảm ơn! – freedrull

+1

Tôi nhận được điều này "TestJob thất bại với NoMethodError: phương thức undefined' add 'cho nil: NilClass ". Câu trả lời của Raghus đã khắc phục điều đó. – idrinkpabst

3

Tôi không thấy lý do tại sao bạn sẽ đặt trình ghi nhật ký trong công việc. Khi tôi đã thực hiện việc này, tôi đặt công nhân sử dụng một tệp cụ thể khi bắt đầu, ví dụ: Logger.new("log/worker_#{worker_number}") đảm bảo rằng mỗi nhân viên xuất ra tập tin riêng của nó và bạn không phải lo lắng về việc nhiều người lao động viết cùng một tập tin cùng một lúc (lộn xộn).

Ngoài ra, trong đồng bằng ol 'ruby bạn có thể gọi @logger.info "logging from delayed_job".

Cuối cùng, tôi khá chắc chắn rằng 'thực hiện' được gọi là trực tiếp bởi nhân viên của bạn và khởi tạo, vì vậy bạn có thể cấu trúc để:

class MyJob 
def perform(blahblah) 
    @logger.add Logger::INFO, "logging from delayed_job" 
    @blahblah = blahblah 
    #do stuff 
end 
end 
+0

Tôi thực sự đã không thể tái cấu trúc theo cách đó, tôi không nghĩ rằng việc thực hiện có bất kỳ đối số nào. Tôi đã không thử phương pháp đăng nhập của bạn kể từ khi câu trả lời trước đó đã làm việc, nhưng tôi tin rằng tôi nhớ đã cố gắng trước đó và nó không hoạt động. – freedrull

+0

Bạn đang phải, mặc dù tôi nên đặt logger trong một initializer hoặc một cái gì đó thay vì đặt nó trong công việc. – freedrull

10

Trong RAILS_ROOT/config/initializers có một tập tin gọi là delayed_job_config.rb với những dòng này:

Delayed::Worker.logger = Rails.logger 
Delayed::Worker.logger.auto_flushing = true 

Hãy nhớ khởi động lại công nhân của bạn sau khi thực hiện việc này.

Hãy cho tôi biết nếu điều này giúp

+0

'auto_flushing' không được chấp nhận trong đường ray 3 và dường như đã bị xóa trong các phiên bản sau –

0

này chỉ làm việc tốt cho tôi trong Rails 3.2:

class FiveMinuteAggregateJob < Struct.new(:link, :timestamp) 
    def perform 
    Rails.logger.info 'yup.' 
    end 
end 
Các vấn đề liên quan