Tại sao tạo một đối tượng Logger thay vì sử dụng các phương thức ghi nhật ký tĩnh trên một ứng dụng?


14

Lấy một ví dụ về ứng dụng Ruby on Rails đơn giản. Nó tạo ra một Loggerđối tượng trong quá trình tải ứng dụng:

# in environment.rb
config.logger = Logger.new(<STDOUT | file | whatever>)

# and in our application we use this object
logger.warn "This process is taking too long to process. Optimization needed."

Câu hỏi của tôi là, tại sao chúng ta không sử dụng các phương thức lớp (hoặc phương thức tĩnh) để ghi nhật ký? Sẽ không Logger.warnquy mô hơn Logger.new.warn? Hoặc ít nhất Logger.warncó vẻ trực quan hơn Logger.new.warn.

Ngay cả khi Logger.newlà một đối tượng đơn lẻ, nó mang lại lợi thế gì?

Câu trả lời:


17

Đây là một ví dụ sử dụng Java. Đã được một thời gian kể từ khi tôi sử dụng log4j, nhưng từ những gì tôi nhớ, toàn bộ công cụ ghi nhật ký log4j sẽ khởi tạo từ một tệp XML. Bản thân tệp XML có thể chứa nhiều logger với các cấu hình khác nhau (nơi bạn ghi vào, mức nào được viết, v.v.). Vì vậy, trong trường hợp này, bạn sẽ có các đối tượng logger chứ không phải các phương thức tĩnh logger để chỉ định logger nào bạn muốn gọi. I E.

Logger logger = Logger.get("Network");

sẽ ghi nhật ký những thứ liên quan đến kết nối mạng, bỏ gói tin, v.v.

Logger logger = Logger.get("Application");

trong đó sẽ ghi lại những thứ liên quan đến logic / ứng dụng kinh doanh của bạn. Ít nhất với log4j, bạn cũng có thể định cấu hình các mức nhật ký thực sự được viết ra (thông tin, theo dõi, cảnh báo, lỗi, gỡ lỗi là các mức mặc định có sẵn).

Nếu bạn có các phương thức tĩnh, cách tốt nhất bạn có thể làm là cấu hình một trình ghi nhật ký duy nhất để trỏ ra tiêu chuẩn, một tệp, v.v., nhưng mọi thứ bạn đăng nhập sẽ đi đến cùng một nơi. Với các đối tượng logger, việc tạo thông tin sẽ dễ dàng hơn để thông tin đăng nhập của bạn được trải rộng ra nhiều tệp.


Cảm ơn. Điều này cũng giúp hiểu được khi nào nên sử dụng các phương thức tĩnh.
Harsh Gupta

2
Mặc dù tôi muốn khởi tạo một đối tượng để thực hiện ghi nhật ký của mình, nhưng như đã trình bày ở đây, nó khá phổ biến (tôi có thể nói là thích hợp hơn) để truy cập nó một cách tĩnh hơn là chuyển nó vào mọi cuộc gọi phương thức. Ghi nhật ký chỉ là loại toàn cầu trong tự nhiên.
Chad Schouggins

Cũng cần lưu ý rằng có những lúc chúng ta có thể muốn định cấu hình bộ ghi bằng cách mở rộng nó (hoặc cung cấp một triển khai của một số giao diện và cung cấp cho bộ ghi). Điều này sẽ được sử dụng để làm một cái gì đó như thay đổi đích ghi nhật ký (ngoài những gì tệp cấu hình có thể cho phép). Tuy nhiên, bạn có thể làm cho trường hợp cụ thể tĩnh, như @ChadSchouggins đã đề cập.
Kat

2

Logger.new là một nhà máy sẽ lấy kết quả sẽ được sử dụng ở đâu (tên của lớp / tệp).

Trong các tệp cấu hình, sau đó bạn có thể quyết định mức độ nào để đăng nhập để không đăng nhập hoàn toàn cho các phần của chương trình mà không phải biên dịch lại dự án.

Do đó, bạn có thể vô hiệu hóa tất cả trừ ghi nhật ký cấp cao (lỗi) cho các bản dựng phát hành và chỉ kích hoạt mức thấp nhất cho các phần bạn đang gỡ lỗi.


2

Gọi phương thức tĩnh nên tránh bất cứ nơi nào có thể. Đây là một giải pháp thay thế cổ xưa cho Tiêm phụ thuộc thích hợp và không phải là thứ bạn sẽ thấy hữu ích trong một cơ sở mã lớn hơn.

Xem xét khả năng kiểm tra, ví dụ. Việc ghi nhật ký tĩnh sẽ đặt Đối tượng được Kiểm tra kiểm soát lớp ghi nhật ký nào được sử dụng - không có Đảo ngược Kiểm soát. Không có khả năng tiêm một đối tượng giả hoặc bất kỳ loại giả mạo nào ở đây. Bằng cách đưa logger vào SUT, bạn sẽ thấy rằng bạn có tùy chọn để giả lập logger và tiêm nó.

Tất nhiên, lợi ích của việc sử dụng DI đối với kiểu gọi phương thức tĩnh đang được thảo luận vượt quá khả năng kiểm tra. Xem xét những gì sẽ xảy ra nếu bạn muốn có hai logger khác nhau trong hệ thống của mình và tùy chọn thay đổi hành vi ứng dụng thông qua cấu hình của biểu đồ đối tượng mà không cần chỉnh sửa mã hiện có.

Nhìn chung, tôi khuyên bạn nên thử một cách tiếp cận DI, vì vậy bạn không tìm thấy mã của mình không khả thi và khó sử dụng sau này.

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.