Mengapa membuat objek Logger daripada menggunakan metode logging statis di aplikasi?

14

Mengambil contoh aplikasi Ruby on Rails sederhana. Itu menciptakan Loggerobjek selama proses pemuatan aplikasi:

# 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."

Pertanyaan saya adalah, mengapa kita tidak menggunakan metode kelas (atau metode statis) untuk login? Bukankah Logger.warnskala Logger.new.warn? Atau setidaknya Logger.warnterlihat intuitif Logger.new.warn.

Bahkan jika Logger.newobjek tunggal, keuntungan apa yang ditawarkannya?

Harsh Gupta
sumber

Jawaban:

17

Berikut ini contoh yang menggunakan Java. Sudah lama sejak saya menggunakan log4j, tetapi dari apa yang saya ingat, seluruh alat log4j logging akan diinisialisasi dari file XML. File XML itu sendiri dapat berisi banyak logger dengan konfigurasi yang berbeda (tempat Anda menulis, level apa yang ditulis, dll). Jadi, dalam hal ini Anda akan memiliki objek logger daripada metode statis logger untuk menentukan logger yang ingin Anda panggil. Yaitu.

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

akan mencatat hal-hal yang berkaitan dengan konektivitas jaringan, paket yang dijatuhkan, dll, atau

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

yang akan mencatat hal-hal yang berkaitan dengan logika / aplikasi bisnis Anda. Setidaknya dengan log4j Anda juga dapat mengkonfigurasi level log mana yang benar-benar ditulis (info, jejak, peringatan, kesalahan, debug menjadi level standar yang tersedia).

Jika Anda memiliki metode statis, yang terbaik yang bisa Anda lakukan adalah mengonfigurasi logger tunggal yang akan menunjukkan standar keluar, file, dll, tetapi semua yang Anda login akan pergi ke tempat yang sama. Dengan objek logger, lebih mudah untuk membuatnya sehingga informasi logging Anda tersebar ke beberapa file.

Shaz
sumber
Terima kasih. Ini juga membantu dalam memahami kapan harus menggunakan metode statis.
Harsh Gupta
2
Sementara saya lebih suka instantiate objek untuk melakukan logging saya, seperti yang ditunjukkan di sini itu cukup umum (saya akan mengatakan preferrable) untuk mengaksesnya secara statis daripada meneruskannya ke setiap pemanggilan metode. Penebangan hanya bersifat global.
Chad Schouggins
Yang juga perlu diperhatikan adalah bahwa ada saat-saat di mana kita mungkin ingin mengkonfigurasi logger dengan memperluasnya (atau menyediakan implementasi dari beberapa antarmuka dan menyediakannya ke logger). Ini akan digunakan untuk melakukan sesuatu seperti mengubah tujuan logging (di luar apa yang memungkinkan file konfigurasi). Namun, Anda mungkin membuat instance spesifik statis, seperti yang disebutkan oleh @ChadSchouggins.
Kat
2

Logger.new adalah pabrik yang akan membawa hasil yang akan digunakan (nama kelas / file).

Dalam file konfigurasi, Anda dapat memutuskan level apa yang akan di-log untuk tidak masuk sama sekali untuk bagian-bagian program tanpa harus mengkompilasi ulang proyek.

Dengan demikian Anda dapat menonaktifkan semua kecuali pencatatan tingkat tinggi (kesalahan) untuk rilis build dan hanya mengaktifkan level terendah untuk bagian yang Anda debug.

aneh ratchet
sumber
2

Doa metode statis harus dihindari sedapat mungkin. Ini adalah alternatif kuno untuk Injeksi Ketergantungan yang tepat, dan bukan sesuatu yang Anda temukan bermanfaat dalam basis kode yang lebih besar.

Pertimbangkan testabilitas, misalnya. Logging yang dijalankan secara statis menempatkan Subjek Di Bawah Tes mengendalikan kelas logging mana yang digunakan - tidak ada Inversi Kontrol. Tidak ada kemungkinan untuk menyuntikkan benda tiruan atau jenis palsu di sini. Dengan menyuntikkan logger ke SUT, Anda akan menemukan bahwa Anda memiliki opsi untuk mengejek logger dan menyuntikkannya.

Manfaat menggunakan DI dibandingkan jenis pemanggilan metode statis yang dibahas tentu saja melampaui testabilitas. Pertimbangkan apa yang akan terjadi jika Anda ingin memiliki dua logger berbeda di sistem Anda, dan opsi untuk mengubah perilaku aplikasi melalui konfigurasi grafik objek saja, tanpa mengedit kode yang ada.

Secara keseluruhan, saya sarankan Anda mencoba pendekatan DI, sehingga Anda tidak menemukan kode Anda tidak dapat diuji dan sulit digunakan nantinya.

Sam Burns
sumber