15

Tôi có một ứng dụng đường ray đơn giản với một vài bộ điều khiển và một số tác vụ cào. Một vài nhiệm vụ được thực hiện bởi cron được cấu hình với whenever gem.Rails ngoại lệ thông báo trong các nhiệm vụ rake

Một trong những nhiệm vụ của tôi được thực hiện hàng ngày và đôi khi nó đặt ra một ngoại lệ và theo mặc định tôi nhận được cảnh báo này bởi cron

rake aborted! 
undefined method `parameterize' for nil:NilClass 

Tasks: TOP => mailboxes:clean_processed 
(See full trace by running task with --trace) 

Tôi muốn gỡ lỗi những gì đang xảy ra và vì lý do này Tôi vừa mới cài đặt exception notification này đá quý với dòng này trong tôi Gemfile

gem "exception_notification", "~> 2.4.1", :require => 'exception_notifier' 

và cấu hình nó trong tập tin application.rb tôi với

# enable exception notification 
config.middleware.use ExceptionNotifier, 
         :email_prefix => "[MyAppName] ", 
         :sender_address => %{"notifier" <[email protected]>}, 
         :exception_recipients => %w{[email protected]} 

Vì đá quý này là một phần mềm trung gian, nó chỉ hoạt động cho các yêu cầu web chứ không phải cho các tác vụ cào. Tôi muốn kích hoạt nó cũng cho các công việc cào và tôi tìm thấy this gist mà làm công việc.

Nó hoạt động, tuy nhiên nó không khô, tôi cần phải lặp lại cấu hình đá quý trong phương pháp đó và tôi cũng cần phải thay đổi tất cả các nhiệm vụ cào của tôi để gửi kèm theo báo cáo của họ trong một khối như trong

exception_notify { actual_task_code } 

Có cách tốt hơn để giải quyết vấn đề này?

P.S. Nếu tôi cần phải thay đổi đá quý thông báo sẽ không là một vấn đề bởi vì tôi chỉ thêm một vài dòng mã vào dự án của tôi.

P.P.S. Tôi biết rằng tôi cũng có thể thay đổi dòng cào trong crontab để thêm một tùy chọn --trace, nhưng tôi không thích giải pháp đó, gây ra trình thông báo ngoại lệ imho là một giải pháp tốt hơn cũng giúp trong mã web.

Cập nhật Tôi vừa phát hiện ra câu hỏi liên quan này: exception_notification for delayed_job nhưng cả hai câu trả lời đều sử dụng một mẹo tương tự.

Tôi sẽ cố gắng với một dịch vụ trực tuyến như Airbrake (trước đây gọi là hoptoad) hoặc vượt trội, nhưng cả hai trong số họ được trả tiền dịch vụ ...

Cập nhật 2: Tôi đã thử các Airbrake App, rất ứng dụng tốt đẹp, nhưng nó phải chịu đựng cùng một vấn đề, tôi vẫn cần phải hack Rakefile để thông báo các ngoại lệ từ các nhiệm vụ rake. Tuy nhiên, hack ít khô hơn vì bạn chỉ cần mã này:

# notify exceptions 
def exception_notify 
    yield 
rescue Exception => exception 
    HoptoadNotifier.notify exception 
    raise exception 
end 

Không cần lặp lại bất kỳ thông số cấu hình nào. Tôi nghĩ rằng tôi không thể làm tốt hơn điều này để được thông báo về các ngoại lệ trong các nhiệm vụ cào.

Trả lời

5

Airbrake đá quý patches Rake cho phép giải cứu, vì vậy nó đã làm những gì tôi đang hỏi ...

+0

Để cho phép ghi nhật ký các lỗi Rake, bạn cần thêm dòng '' 'config.rescue_rake_exceptions = true''' vào' '' conifg/initializers/airbrake.rb'''. – KurtPreston

1

Cảm ơn đề xuất này; nó hoạt động tốt cho tôi vì tôi chỉ có một nhiệm vụ cron vào lúc này.

để làm khô nó lên, bạn có thể chuyển các cấu hình vào các hằng số, có lẽ qua APP_CONFIG: https://github.com/cjbottaro/app_config

Bên cạnh đó, bạn có thể mở rộng bất cứ lớp học chăm sóc task :... do để bọc tất cả mọi thứ trong exception_notify { }.

+1

Tôi quan tâm đến bạn gợi ý cuối cùng, bạn có thể mở rộng một chút? – Fabio

+0

Bạn cần phải tìm hiểu cách hoạt động của công việc cào cào, sâu hơn vào khung công tác Rails. Tôi cũng không biết chi tiết. Nhưng bạn có thể mở rộng những người được phân loại để làm bất cứ điều gì bạn thích. –

13

Tạo một file task.rb trong config/initializers, mà các bản vá lỗi khỉ Rake :: Nhiệm vụ # thực hiện bao gồm các chức năng của exception_notify:

module Rake 
    class Task 
    alias :orig_execute :execute 
    def execute(args=nil) 
     orig_execute(args) 
    rescue Exception => exception 
     # Exception notification stuff 
    end 
    end 
end 

Đã kiểm tra bằng Rails 3.0.12, Rake 0.9.2.2.

+1

Xin lưu ý rằng bạn cần yêu cầu "rake/task", hoặc giao diện điều khiển của Rails sẽ không còn chạy do một NameError nữa. –

Các vấn đề liên quan