đặt vs logger trong các nhiệm vụ rails rake


108

Trong một tác vụ rake nếu tôi sử dụng lệnh put thì tôi sẽ thấy đầu ra trên bảng điều khiển. Tuy nhiên, tôi sẽ không thấy thông báo đó trong tệp nhật ký khi ứng dụng được triển khai trên phiên bản sản xuất.

Tuy nhiên, nếu tôi nói Rails.logger.info thì ở chế độ phát triển, tôi không thấy gì trên bảng điều khiển. Tôi cần truy cập tệp nhật ký và điều chỉnh nó.

Lý tưởng nhất là tôi muốn sử dụng Rails.logger.info và trong chế độ phát triển bên trong tác vụ rake, đầu ra từ trình ghi nhật ký cũng phải được gửi đến bảng điều khiển.

Có cách nào để đạt được điều đó?

Câu trả lời:


57

Đặt cái này vào application.rbhoặc trong mã khởi tạo tác vụ cào

if defined?(Rails) && (Rails.env == 'development')
  Rails.logger = Logger.new(STDOUT)
end

Đây là mã Rails 3. Lưu ý rằng điều này sẽ ghi đè lên việc đăng nhập development.log. Nếu bạn muốn cả hai STDOUTdevelopment.logbạn sẽ cần một hàm wrapper.

Nếu bạn chỉ muốn hành vi này trong bảng điều khiển Rails, hãy đặt cùng một khối mã vào của bạn ~/.irbrc.


26
Sẽ không dễ dàng hơn nếu chỉ đưa Rails.logger = Logger.new(STDOUT)vào development.rb?
ghempton

Đối với đường ray 2, đặt điều này trong development.rb của bạn:config.logger = Logger.new(STDOUT)
jsarma

38

Bạn có thể tạo một nhiệm vụ cào mới để làm cho nó hoạt động.

desc "switch logger to stdout"
task :to_stdout => [:environment] do
 Rails.logger = Logger.new(STDOUT)
end

Bằng cách này khi bạn thực hiện tác vụ rake của mình, bạn có thể thêm to_stdout trước để nhận thông báo nhật ký stdout hoặc không bao gồm nó để gửi thông báo đến tệp nhật ký mặc định

rake to_stdout some_task

11

Các tác vụ cào được chạy bởi người dùng, trên một dòng lệnh. Bất cứ điều gì họ cần biết ngay lập tức ("đã xử lý 5 hàng") sẽ được xuất trên thiết bị đầu cuối với puts.

Bất cứ điều gì cần được lưu giữ cho hậu thế ("đã gửi email cảnh báo đến jsmith@example.com") nên được gửi đến Rails.logger.


17
Không có gì lạ khi chạy các tác vụ rake với cron.
Johannes Gorset

2
Thật. Nếu bạn muốn thông báo nhật ký được gửi qua email cho bạn khi công việc cron hoàn thành, hãy chuyển chúng ra $ stdout hoặc $ stderr.
Jonathan Julian

10

Tôi muốn nói rằng sử dụng Rails.logger.infolà cách để đi.

Bạn sẽ không thể thấy nó trong bảng điều khiển máy chủ vì nó sẽ không chạy qua máy chủ. Chỉ cần mở một bảng điều khiển mới và tail -ftệp nhật ký, nó sẽ thực hiện được thủ thuật.

Nhiều người dùng biết đến lệnh UNIX® 'tail', lệnh này có thể được sử dụng để hiển thị vài dòng cuối cùng của một tệp lớn. Điều này có thể hữu ích để xem các tệp nhật ký, v.v.

Thậm chí còn hữu ích hơn trong một số trường hợp, là tham số '-f' đối với lệnh 'tail'. Điều này làm cho đuôi 'theo' đầu ra của tệp. Ban đầu, phản hồi sẽ giống như đối với 'tail' - một vài dòng cuối cùng của tệp sẽ được hiển thị. Tuy nhiên, lệnh không quay trở lại lời nhắc, và thay vào đó, tiếp tục 'theo dõi' tệp. Khi các dòng bổ sung được thêm vào tệp, chúng sẽ được hiển thị trên thiết bị đầu cuối. Điều này rất hữu ích để xem các tệp nhật ký hoặc bất kỳ tệp nào khác có thể được thêm vào theo thời gian. Nhập 'đuôi người' để biết thêm chi tiết về loại đuôi này và các tùy chọn đuôi khác.

( qua )


Nhưng không thoải mái lắm khi làm việc trên máy cục bộ vì bạn không thấy kết quả đầu ra trong cùng cửa sổ nơi bạn đã gọi tác vụ. Đặc biệt nếu bạn không có màn hình lớn để đặt nhiều cửa sổ cạnh nhau.
Tomas Markauskas

10
Thậm chí tốt hơn là sử dụng tailf"Nó tương tự như đuôi -f nhưng không truy cập tệp khi nó không phát triển" (từ manpage). Nó cũng ngắn hơn
MBO

@tomas tại sao không thu nhỏ bảng điều khiển nhật ký máy chủ và chỉ có một bảng điều khiển với đuôi-f đang chạy? Dù sao nó không phải là một vấn đề thực sự ... Tôi đang chạy như 8 console truy tìm những gì đang xảy ra trong ứng dụng của tôi, chỉ cần chuyển qua lại giữa các tab khi bạn đang làm việc trên một phần cụ thể của hệ thống không lớn thỏa thuận IMHO
marcgg

@mbo đẹp :) Halas nó không giống như nó có sẵn trên máy tính của tôi (mac os @ beo)
marcgg

1
@marcgg: Tôi không có "bảng điều khiển máy chủ" (tôi sử dụng hành khách), nhưng câu hỏi là về các tác vụ cào và nếu bạn chạy một tác vụ từ một cửa sổ đầu cuối, bạn sẽ không thấy gì từ trình ghi nhật ký trong cửa sổ đó. Bạn phải có một cửa sổ khác với development.log để xem kết quả. Lý tưởng nhất là bằng cách nào đó tôi sẽ thêm stdout làm luồng đầu ra khác vào Rails.logger, nhưng không xóa luồng gốc.
Tomas Markauskas

9

Đối với Rails 4 và mới hơn, bạn có thể sử dụng Logger broadcast .

Nếu bạn muốn nhận cả STDOUT và ghi nhật ký tệp cho các tác vụ rake trong chế độ phát triển, bạn có thể thêm mã này vào config/environments/development.rb:

  if File.basename($0) == 'rake'
    # http://stackoverflow.com/questions/2246141/puts-vs-logger-in-rails-rake-tasks
    log_file     = Rails.root.join("log", "#{Rails.env}.log")
    Rails.logger = ActiveSupport::Logger.new(log_file)
    Rails.logger.extend(ActiveSupport::Logger.broadcast(ActiveSupport::Logger.new(STDOUT)))
  end

Kiểm tra

Đây là một nhiệm vụ Rake nhỏ để kiểm tra đoạn mã trên:

# lib/tasks/stdout_and_log.rake
namespace :stdout_and_log do
  desc "Test if Rails.logger outputs to STDOUT and log file"
  task :test => :environment do
    puts "HELLO FROM PUTS"
    Rails.logger.info "HELLO FROM LOGGER"
  end
end

Chạy rake stdout_and_log:testđầu ra

HELLO FROM PUTS
HELLO FROM LOGGER

trong khi

HELLO FROM LOGGER

đã được thêm vào log/development.log.

Chạy rake stdout_and_log:test RAILS_ENV=productionđầu ra

HELLO FROM PUTS

trong khi

HELLO FROM LOGGER

đã được thêm vào log/production.log.


Trong Rails 5, basename($0) == 'rake'thủ thuật không còn hoạt động nữa, vì railslệnh tự chạy rake. Tôi muốn tìm một sự thay thế tốt cho nó ngoài việc phụ thuộc vào nhiệm vụ thiết lập broadcast. (Phần đó, ít nhất, vẫn hoạt động tốt.)
Brent Royal-Gordon

@ BrentRoyal-Gordon Không cần cho điều kiện này trong sự phát triển, bạn chỉ có thể thêm mã để Rakefileở thư mục gốc của dự án của bạn
Mauricio Pasquier Juan

4

Làm thế nào về việc tạo một trình trợ giúp ứng dụng để phát hiện môi trường nào đang chạy và thực hiện đúng?

def output_debug(info)
   if RAILS_ENV == "development"
      puts info
   else
      logger.info info
   end
end

Sau đó gọi output_debug thay vì put hoặc logger.info


5
Tôi không nghĩ đây là một ý kiến ​​hay. Trình ghi nhật ký Rails có nghĩa là có thể cấu hình được, nhưng thay vì sử dụng khả năng cấu hình đó, bạn chỉ cần xếp chồng nhiều lớp hơn lên trên nó ở đây.
Sijmen Mulder

Vâng, đó không phải là một ý kiến ​​hay vì việc kiểm tra tương tự sẽ được thực hiện mỗi khi bạn muốn ghi lại một thứ gì đó.
furiabhavesh

3

Trong Rails 2.X để chuyển hướng trình ghi nhật ký đến STDOUT trong các mô hình:

ActiveRecord::Base.logger = Logger.new(STDOUT)

Để chuyển hướng trình ghi nhật ký trong bộ điều khiển:

ActionController::Base.logger = Logger.new(STDOUT)

Tôi cũng tìm thấy bài viết này, rất hữu ích sepcot.com/blog/2009/08/rails-logging-to-stdout
Tania R

2

Thực thi một công việc nền với '&' và mở script / console hoặc bất cứ thứ gì .. Bằng cách đó, bạn có thể chạy nhiều lệnh trong cùng một cửa sổ.

tail -f log/development.log &
script/console
Loading development environment (Rails 2.3.5)
>> Product.all
2011-03-10 11:56:00 18062 DEBUG  Product Load (6.0ms)  SELECT * FROM "products"
[<Product.1>,<Product.2>]

lưu ý Có thể trở nên cẩu thả nhanh chóng khi có nhiều kết quả ghi nhật ký.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.