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

Đăng nhập Ruby bằng Logger và Lograge

Làm việc với Nhật ký trong Ruby

Ghi nhật ký là một trong những tác vụ chính mà ứng dụng thường giải quyết. Nhật ký được sử dụng khi bạn cần, chẳng hạn như

  • xem điều gì đang xảy ra bên trong ứng dụng của bạn,
  • giám sát chúng hoặc
  • thu thập các chỉ số cho một số dữ liệu cụ thể.

Khi học một ngôn ngữ lập trình mới, lựa chọn rõ ràng đầu tiên để ghi thông tin là cơ chế gốc. Nó thường dễ dàng, được lập thành văn bản và được phổ biến rộng rãi trong cộng đồng.

Dữ liệu nhật ký thay đổi rất nhiều tùy thuộc vào công ty, doanh nghiệp và loại ứng dụng bạn đang làm việc. Do đó, điều rất quan trọng là phải hiểu giải pháp ghi nhật ký mà bạn và nhóm của bạn đã chọn sẽ ảnh hưởng như thế nào đến việc sử dụng tổng thể.

Trong bài viết này, chúng ta sẽ đi qua các tùy chọn ghi nhật ký sẵn có cho Ruby và Rails, từ các tùy chọn cài sẵn cho đến các khuôn khổ cộng đồng bên thứ ba yêu thích. Bắt đầu!

Các tùy chọn tích hợp của Ruby

Ruby đi kèm với hai tùy chọn tích hợp để xử lý việc ghi nhật ký:lệnh in (được thiết kế đặc biệt cho các kịch bản dòng lệnh) và lớp Người ghi nhật ký.

Hãy khám phá chúng một chút.

Ruby có bốn cách phổ biến để in văn bản vào bảng điều khiển:puts , print , ppp .

puts phương thức in bất cứ thứ gì bạn chuyển cho nó, theo sau là một dòng mới:

2.7.0 :001 > puts "Hey, I'm a log!"
Hey, I'm a log!
 => nil

print phương pháp tương tự như puts , tuy nhiên, nó luôn chuyển đổi các đối số thành chuỗi bằng cách sử dụng to_s phương pháp.

Cuối cùng, ppp cả hai phương pháp sẽ in đối tượng thô mà bạn đang chuyển cho chúng mà không thực hiện chuyển đổi; sự khác biệt duy nhất là cái sau định dạng đầu ra theo cách thụt lề hơn, trong khi cái trước thì không.

Nhật ký Ứng dụng

Đối với các ứng dụng chạy trên máy chủ, không có ý nghĩa gì khi in ra bảng điều khiển.

Thay vào đó, chúng tôi sử dụng Logger , linh hoạt hơn nhiều.

Đây là cách bạn có thể sử dụng nó để in nhật ký "gỡ lỗi":

require "logger"
logger = Logger.new(STDOUT)
logger.debug("I'm a debug log")

Chúng tôi cũng có thể định cấu hình nó để lưu trữ nhật ký vào một tệp hoặc gửi chúng đến một bộ tổng hợp nhật ký thay vì in ra STDOUT nếu chúng tôi muốn.

Trong trường hợp bạn đang tự hỏi, "gỡ lỗi" là một cấp độ nhật ký. Các cấp độ nhật ký cho phép bạn nói với hệ thống "thông báo nhật ký này có liên quan đến một loại sự kiện nhất định." Có sáu cấp độ nhật ký được tích hợp sẵn:Fatal, Error, Warn, Info, Debug và Unknown.

logger.debug("I'm a debug log")
logger.info("I'm an info log")
logger.warn("I'm a warn log")
logger.error("I'm an error log: error message")
logger.fatal("I'm a fatal log")

Khi chúng tôi nhìn vào đầu ra nhật ký, chúng tôi thấy rằng cấp nhật ký, id quy trình và dấu thời gian đã được thêm vào mỗi dòng:

Đăng nhập Ruby bằng Logger và Lograge

Một tính năng tuyệt vời khác là khả năng đặt Logger của bạn đối tượng ở một cấp độ cụ thể:

logger.level = Logger::WARN

Khi bạn thực hiện việc này, Logger sẽ chỉ xử lý các nhật ký bằng hoặc cao hơn để cảnh báo tầm quan trọng. Điều này rất hữu ích trong sản xuất, nơi chúng tôi có thể không muốn lưu nhật ký "gỡ lỗi" do kích thước hoặc lý do bảo mật.

Đây sẽ là đầu ra:

Đăng nhập Ruby bằng Logger và Lograge

Tùy chỉnh nhật ký của bạn

Nếu bạn muốn tùy chỉnh nhật ký của mình, có rất nhiều tùy chọn. Ví dụ:để thay đổi ngày và giờ, chỉ cần ghi đè ngày và giờ mặc định:

logger.datetime_format = "%Y-%m-%d %H:%M"

Dưới đây là một ví dụ về đầu ra:

W, [2020-07-28 10:50#87786]  WARN -- : I'm a warn log

date_time định dạng tuân theo đặc điểm kỹ thuật tiêu chuẩn, vì vậy hãy nhớ tham khảo nó khi thực hiện các thay đổi như vậy.

Tuy nhiên, đôi khi, bạn có thể cần phải sửa đổi hoàn toàn định dạng nhật ký của mình. Với mục đích này, Ruby cung cấp lớp Formatter. Nó hoạt động bằng cách cho phép các nhà phát triển ghi đè lên mẫu mặc định Logger sử dụng để in nhật ký.

Hãy tưởng tượng rằng ứng dụng của bạn sử dụng công cụ phân tích nhật ký tập trung và cần tất cả nhật ký của bạn được in dưới dạng name=value định dạng. Đây sẽ là mã định dạng mới:

logger.formatter = proc do |severity, datetime, progname, msg|
    date_format = datetime.strftime("%Y-%m-%d %H:%M:%S")
    "date=[#{date_format}] severity=#{severity.ljust(5)} pid=##{Process.pid} message='#{msg}'\n"
end

Ở đây, chúng tôi đang sử dụng proc để chặn tất cả các bản ghi và thay đổi cách mặc định chúng được in thành bản ghi mong muốn. Bây giờ, chúng tôi có kết quả sau:

Đăng nhập Ruby bằng Logger và Lograge

Chỉ với một vài dòng mã, tất cả nhật ký ứng dụng của bạn giờ đây có thể được công cụ lập chỉ mục.

Đăng nhập vào JSON

Với sức mạnh của Formatter trong khi đó, thật dễ dàng tùy chỉnh nhật ký của bạn thành bất kỳ loại đầu ra nào bạn muốn. Ví dụ:chúng tôi có thể sử dụng mô-đun JSON để xuất nhật ký của chúng tôi ở định dạng đó.

require "json"
logger.formatter = proc do |severity, datetime, progname, msg|
    date_format = datetime.strftime("%Y-%m-%d %H:%M:%S")
    JSON.dump(date: "#{date_format}", severity:"#{severity.ljust(5)}", pid:"##{Process.pid}", message: msg) + "\n"
end

Và đây là các bản ghi kết quả:

Đăng nhập Ruby bằng Logger và Lograge

Đăng nhập vào tệp

Như đã thấy trước đây, Logger phương thức khởi tạo nhận, với tư cách là đối số đầu tiên, nơi lưu trữ nhật ký.

Nếu bạn muốn lưu nhật ký của mình vào một tệp, chỉ cần nói như vậy:

require 'logger'
logger = Logger.new('my_logs.log')

Thao tác này sẽ tạo một tệp mới my_logs.log trong cùng một thư mục nơi chứa tệp Ruby của bạn chứa mã này:

Đăng nhập Ruby bằng Logger và Lograge

Tuy nhiên, lớp này cũng cho phép một loạt các tùy chọn tùy chỉnh, chẳng hạn như cấu hình chính sách lưu giữ. Lấy ví dụ sau:

# Keep data for the current week.
Logger.new('my_weekly_logs.log', 'weekly')
# Keep data for today and the past 2 months.
Logger.new('my_latest_2_months_logs.log', 2, 'monthly')
# Restarts the log over when it exceeds 26GB in size.
Logger.new('my_custom_logs.log', 0, 20 * 1024 * 1024 * 1024)

Là một tham số thứ hai, Logger chấp nhận định nghĩa về tần suất lưu giữ hoặc xóa nhật ký.

Trong đối tượng đầu tiên, các bản ghi sẽ chỉ được lưu giữ trong một tuần. Cái thứ hai sẽ lưu trữ chúng trong khoảng hai tháng, trong khi cái mới nhất sẽ chỉ phân tích kích thước của tệp (ví dụ:bất cứ khi nào nó đạt đến 20GB, nó sẽ bị loại bỏ) dựa trên thông số thứ ba.

Đăng nhập Ruby on Rails

Hầu hết các lợi ích của Logger chúng tôi đã thấy cho đến nay tất cả đều có thể được sử dụng cùng với các ứng dụng Rails. Phiên bản Rails của Logger chỉ là một phần mở rộng đơn giản của lớp gốc của Ruby.

Ngoài ra, Rails cũng bổ sung một tính năng hay để cho phép các nhà phát triển phát nhật ký của họ đến nhiều trình ghi nhật ký. Do đó, nếu bạn muốn làm việc với nhiều thư viện ghi nhật ký, bạn có thể làm như vậy trong Rails logger :

custom_logger = Logger.new(STDOUT)
Rails.logger.extend(ActiveSupport::Logger.broadcast(custom_logger))

Điều này cũng có thể hữu ích khi bạn cần một số thông tin liên quan đến những nơi mà nhật ký của bạn sẽ đến. Một số phần trong ứng dụng của bạn có thể cần nhật ký ở các vị trí khác nhau hoặc các định dạng khác nhau.

Chọn Khung ghi nhật ký của bên thứ ba

Nếu trình ghi nhật ký tích hợp của Ruby không thực hiện chính xác những gì bạn cần, bạn có các tùy chọn.

Có rất nhiều tùy chọn khi chọn khung ghi nhật ký của bên thứ ba. Phổ biến nhất trong số này là Lograge. Hãy cùng xem qua!

Các bước đầu tiên với Lograge

Lograge được tạo cho các ứng dụng Rails. Nếu bạn đang làm việc với vani Ruby, nó có thể không phải là một lựa chọn tốt.

Để cài đặt nó, chỉ cần thêm đá quý sau:

bundle add lograge

Sau đó, tạo tệp cấu hình mới tại config / initializers / lograge.rb với mã sau:

Rails.application.configure do
    config.lograge.enabled = true
    config.lograge.custom_options = lambda do |event|
        { time: event.time }
    end
end

Cấu hình này cho phép Lograge và xác định thời gian mà một nhật ký, được coi là một sự kiện đối với khuôn khổ, phải được in.

Khi bạn khởi động ứng dụng Rails và truy cập điểm cuối đầu tiên, Lograge sẽ in tóm tắt yêu cầu. So sánh các nhật ký trước và sau khi thiết lập Lograge tương ứng, kết quả như hình dưới đây:

Đăng nhập Ruby bằng Logger và Lograge

Một lần nữa, Lograge không phải là một viên đạn bạc; nó thực sự là một khuôn khổ rất cố chấp. Vì vậy, có thể bạn sẽ cần sử dụng nó cùng với Logger tích hợp sẵn (hoặc các khuôn khổ khác tùy thích của bạn).

Kết thúc

Cuối cùng, rõ ràng hơn là ghi nhật ký không chỉ là một phần quan trọng trong các dự án của bạn mà còn bị đánh giá rất thấp. Để hiểu rõ hơn về các công cụ bạn đang sử dụng, bất kể chúng có phải là công cụ gốc hay không, cũng sẽ giúp bạn đạt được kết quả tốt hơn.

Đảm bảo luôn tiến hành nhiều thử nghiệm để áp dụng một khuôn khổ mới. Đôi khi nền tảng của bạn đã đi kèm với các tùy chọn tích hợp tuyệt vời. Nếu không đúng như vậy, hãy xác định xem nó có cho phép sử dụng các khuôn khổ khác được tích hợp với khuôn khổ đã có bên trong hay không.

Chúc bạn may mắn!