Computer >> Máy Tính >  >> Lập trình >> Ruby

Giữ nhật ký của bạn không trở thành một tin nhắn không thể đọc được

Khi bạn gặp phải một lỗi lạ, dường như không thể giải quyết được, cải thiện việc ghi nhật ký có thể là bước tốt nhất mà bạn có thể thực hiện. Ghi nhật ký tuyệt vời là cách dễ nhất để phát hiện và sửa toàn bộ các lớp lỗi. Khi ghi đủ thông tin, bạn có thể thấy dữ liệu của mình thay đổi như thế nào trong khi yêu cầu. Bạn có thể theo dõi các cuộc gọi đến các dịch vụ khác và điều tra phản hồi. Trên thực tế, khi trình gỡ lỗi không thành công, việc ghi nhật ký đã giúp tôi sửa lỗi khó nhất mà tôi từng gặp phải.

Tuy nhiên, ghi lại quá nhiều và các tệp nhật ký của bạn sẽ nhanh chóng biến thành một mớ hỗn độn của các thông báo không thể đọc được, vô ích. Làm thế nào bạn có thể chia nhỏ thông tin bạn quan tâm từ đống dữ liệu đó? Bạn có thể in thư theo cách dễ lọc sau này không?

Đánh dấu thông báo nhật ký của bạn

Rails bao gồm TaggedLogging, có thể giúp bạn nhanh chóng phân loại các thông báo nhật ký liên quan. Khi bạn gắn thẻ một trình ghi nhật ký, bạn sẽ nhận được một điểm đánh dấu ở đầu thư của mình. Vì vậy, thay vì:

Finding people...
  Person Load (0.3ms)  SELECT "people".* FROM "people"
Found 0 people!

Bạn có thể gắn thẻ cho trình ghi nhật ký Rails:

logger.tagged("People") do
  logger.debug "Finding people..."
  @people = Person.all
  logger.debug "Found #{@people.length} people!"
end

Và bạn sẽ thấy một cái gì đó như thế này:

[People] Finding people...
[People]   Person Load (0.3ms)  SELECT "people".* FROM "people"
[People] Found 0 people!

Giờ đây, nhật ký các tin nhắn quan tâm đến những thứ khác nhau có thể trông khác nhau.

Một số ví dụ về trình ghi nhật ký được gắn thẻ

Khi bạn ghi nhật ký thường xuyên hơn và ghi lại những thứ phức tạp hơn, bạn sẽ tự nhiên nhận thấy những khu vực mà các thẻ đó sẽ làm cho thông điệp của bạn rõ ràng hơn. Nhưng có một số nơi tôi nhận thấy rằng việc ghi nhật ký được gắn thẻ đặc biệt hữu ích. Tôi thường sẽ gắn thẻ những người đó ngay lập tức.

Bạn có thể ghi lại các yêu cầu mà bạn thực hiện đối với các API khác:

logger.tagged("GitHub API") do
  uri = URI("https://api.github.com/repos/rails/rails/tags")

  logger.info { "Fetching #{uri}" }
  tags = JSON.parse(Net::HTTP.get(uri))
  logger.info { "First tag: #{tags.first["name"]}" }
end
[GitHub API] Fetching https://api.github.com/repos/rails/rails/tags
[GitHub API] First tag: v4.2.4.rc1

Bằng cách đó, bạn có thể dễ dàng xem cách thức và thời điểm ứng dụng của bạn kết nối với API đó.

(Điều này hoạt động đặc biệt tốt với phần mềm trung gian Faraday hoặc nếu bạn chỉ giao tiếp với máy chủ thông qua Cổng).

Công việc nền cũng hoạt động tốt với ghi nhật ký được gắn thẻ:

require "active_support/tagged_logging"

Resque.logger = ActiveSupport::TaggedLogging.new(Resque.logger)

module LoggedJob
  def around_perform_log_job(*args)
    logger.tagged(name) do
      logger.info { "Performing #{name} with #{args.inspect}" }
      yield
    end
  end
end

class MyJob
  extend LoggedJob

  def self.perform(*args)
    ...
  end
end

Bây giờ, bất kỳ công việc nào mở rộng LoggedJob sẽ có tất cả các thông báo nhật ký của nó được gắn thẻ với tên lớp của công việc.

Và nếu bạn có người dùng đã đăng nhập, bạn có thể gắn thẻ tin nhắn bằng ID người dùng của họ:

logger.tagged(current_user_id ? "user-#{current_user_id}" : "user-anonymous") do
  logger.debug "Finding people..."
  @people = Person.all
  logger.debug "Found #{@people.length} people!"
end
[user-123] Finding people...
[user-123]   Person Load (0.3ms)  SELECT "people".* FROM "people"
[user-123] Found 0 people!

Cuối cùng, nếu bạn thêm một dòng vào config/environments/production.rb của mình (hoặc development.rb ), bạn có thể để Rails tự động gắn thẻ tin nhắn của mình:

config.log_tags = [ :subdomain, :uuid ]

log_tags liệt kê các thẻ bạn muốn xuất hiện ở đầu mỗi mục nhập nhật ký Rails. Mỗi biểu tượng đề cập đến một phương thức trên ActionDispatch ::Request, vì vậy :uuid nghĩa là request.uuid .

Bạn cũng có thể chuyển một Proc có request đối tượng:

config.log_tags = [ :subdomain, :uuid, lambda { |request| request.headers["User-Agent"] } ]

Nhưng tôi không thấy điều đó thường xuyên.

Các thẻ mặc định này rất hay:uuid có thể liên kết tất cả các mục nhật ký lại với nhau trong một yêu cầu và nếu bạn đang giữ các phiên trên máy chủ, thì ID phiên cũng rất hữu ích. Với các thẻ đó và đủ thông báo, bạn có thể theo dõi một số đường dẫn thực sự phức tạp thông qua ứng dụng của mình. Và thông thường, đó là những gì cần thiết để tìm ra cách một lỗi khó chịu đã xảy ra.

Mức độ bạn sử dụng trình ghi nhật ký Rails trong các ứng dụng của mình? Bạn đã thử ghi nhật ký được gắn thẻ chưa? Nếu bạn chưa có, hãy thử tìm một nơi cho nó. Gắn thẻ các hành động do người dùng của bạn thực hiện là một khởi đầu tốt. Nó sẽ hữu ích cho bạn vào lần tiếp theo khi bạn phải gỡ lỗi một lỗi nhiều bước điên rồ.

Nếu bạn muốn tìm hiểu thêm về cách ghi nhật ký và các kỹ thuật gỡ lỗi khác, tôi đã dành toàn bộ chương Thực hành Rails để tìm và sửa các lỗi bạn sẽ gặp phải khi tạo ứng dụng của mình. Tải chương đầu tiên miễn phí tại đây.