hexlog berisi sistem logging yang terinspirasi oleh log4j yang ditulis dalam haxe
Temukan informasi lebih lanjut tentang hexmachina di hexmachina.org
Aplikasi menggunakan HEXLOG API akan meminta logger dengan nama tertentu dari LogManager. LogManager akan menemukan LoggerContext yang sesuai dan kemudian mendapatkan logger darinya. Jika logger harus dibuat, itu akan dikaitkan dengan LoggerConfig yang berisi baik: a) nama yang sama dengan logger, b) nama paket induk, atau c) root loggeronfig. Objek Loggeronfig dibuat dari deklarasi logger dalam konfigurasi. LoggerConfig dikaitkan dengan logTarget yang benar -benar memberikan logevents.
Keuntungan terbesar menggunakan hexlog dibandingkan trace standar adalah kemampuan untuk menonaktifkan pernyataan log tertentu sambil memungkinkan orang lain dicetak tanpa perubahan. Kemampuan ini mengasumsikan bahwa ruang penebangan, yaitu ruang dari semua pernyataan logging yang mungkin, dikategorikan menurut beberapa kriteria yang dipilih pengembang. Pencatat dan LoggerConfigs dinobatkan sebagai entitas. Nama logger peka huruf besar-kecil dan mereka mengikuti aturan penamaan hierarkis.
Hierarki penamaan
LoggerConfig dikatakan sebagai leluhur dari LoggerConfig lain jika namanya diikuti oleh titik (
.) Adalah awalan dari nama logger keturunan . LoggerConfig dikatakan sebagai orang tua dari anak -anak LoggerConfig jika tidak ada leluhur di antara dirinya sendiri dan keturunan LoggerConfig.
Misalnya, LoggerConfig bernama "com.foo" adalah orang tua dari LoggerConfig bernama "com.foo.Bar" . Demikian pula, "hex" adalah orang tua dari "hex.log" dan leluhur "hex.log.Logger" . Skema penamaan ini harus akrab bagi sebagian besar pengembang. Root LoggerConfig berada di bagian atas hierarki. Luar biasa karena selalu ada dan merupakan bagian dari setiap hierarki. Logger yang secara langsung terhubung ke Roo LoggerConfig dapat diperoleh sebagai berikut:
var rootLogger = LogManager . getLogger ( " " );
// or more simply
var rootLogger = LogManager . getRootLogger (); Semua penebang lainnya dapat diambil dengan menggunakan metode statis Logmanager.getLogger dengan memberikan nama logger yang diinginkan.
LoggerContext bertindak sebagai titik jangkar dari sistem logging. Saat ini tidak mungkin untuk memiliki beberapa LoggerContexts tetapi Anda dapat mengubah implementasi LoggerContext dengan mengubah nilai LogManager.context properti statis.
Jika Anda ingin menggunakan logging dalam konteks makro, Anda dapat menggunakan MacroLoggerContext yang sudah disiapkan yang memiliki pabrik pesan yang telah dikonfigurasi sebelumnya dan pesan yang dirancang khusus untuk ekspresi pencetakan.
LoggerContext memiliki Configuration aktif. Konfigurasi berisi semua Logtarget, filter di seluruh konteks dan LoggerConfigs.
Seperti yang dinyatakan sebelumnya, Logger dapat dibuat dengan memanggil LogManager.getLogger . Logger itu sendiri tidak melakukan tindakan langsung. Ini hanya memiliki nama dan dikaitkan dengan LoggerConfig. Ini memperluas AbstractLogger dan mengimplementasikan metode yang diperlukan. Karena konfigurasi dimodifikasi, penebang dapat dikaitkan dengan LoggerConfig yang berbeda, sehingga menyebabkan perilaku mereka dimodifikasi.
Memanggil Metode LogManage.getLogger dengan nama yang sama akan selalu mengembalikan referensi ke objek Logger yang sama persis. Itu artinya:
var x = LogManager . getLogger ( " something " );
var y = LogManager . getLogger ( " something " ); x dan y merujuk pada objek logger yang sama persis . ( x == y selalu true )
Konfigurasi lingkungan hexlog selalu dilakukan pada inisialisasi aplikasi.
HEXLOG memudahkan untuk memberi nama Loggers by Software Component . Ini dapat dicapai dengan Instantiating Logger di setiap kelas, dengan nama logger sama dengan nama kelas yang sepenuhnya memenuhi syarat. Ini adalah metode yang berguna dan mudah untuk mendefinisikan penebang. Karena output log menyandang nama logger yang menghasilkan, strategi penamaan ini memudahkan untuk mengidentifikasi asal pesan log. Namun ini hanya salah satu strategi penamaan penamaan dan hexlog tidak membatasi seperangkat penebang yang mungkin. Pengembang selalu bebas menyebutkan nama logger seperti yang diinginkan.
Untuk kenyamanan hexlog menyediakan serangkaian fungsi yang dapat Anda impor untuk menghasilkan panggilan getLogger secara otomatis. Ini sangat berguna saat menggunakan file import.hx . (Lihat contoh)
Metode kenyamanan tambahan adalah getLoggerByClass dan getLoggerByInstance yang berguna dalam konteks makro di mana Anda tidak dapat menggunakan kelas kenyamanan hexlog.
Objek Loggeronfig dibuat ketika penebang dinyatakan dalam konfigurasi logging. LoggerConfig berisi set filter yang harus memungkinkan logevent untuk lulus sebelum akan diteruskan ke target logtan apa pun. Ini juga berisi referensi ke himpunan logtarget yang harus digunakan untuk memproses acara.
Selain hexlog penyaringan logglevel otomatis menyediakan filter yang dapat diterapkan:
Informasi lebih lanjut tentang filter dan penyaringan
Kemampuan untuk secara selektif mengaktifkan atau menonaktifkan permintaan logging berdasarkan logger mereka hanyalah bagian dari gambar. Hexlog memungkinkan permintaan logging dicetak ke beberapa tujuan. Dalam berbicara hexlog, tujuan output disebut logTarget.
Informasi lebih lanjut tentang target log
Lebih sering daripada tidak, pengguna ingin menyesuaikan tidak hanya tujuan output tetapi juga format output. Ini dicapai dengan mengaitkan tata letak dengan logtarget. Tata letak bertanggung jawab untuk memformat LogEvent ke keinginan pengguna, sedangkan target log menangani pengiriman output yang diformat ke tujuannya.
Informasi lebih lanjut tentang tata letak
Secara internal dalam sistem setiap pernyataan log diwakili oleh objek pesan.
Informasi lebih lanjut tentang pesan
// Getting logger
var logger = LogManager . getLogger ( " LoggerName " );
// Logging simple message
logger . debug ( " Some message " );
// Logging message with parameters
var name = " World " ;
logger . debug ( " Hello {} " , [ name ]);HexLog KenyamananJika Anda berencana untuk mencatat secara luas, itu adalah praktik yang baik untuk terlebih dahulu mendapatkan looger dari kelas Anda dan kemudian menggunakannya untuk mengirim pesan Anda
import hex . log . HexLog . * ; // Import all convenience functions
// If you're planning to use logger extensively, first get logger for your class
var logger = getLogger ();
// Gets replaced with:
// var logger = hex.log.LogManager.getLogger("my.current.class");
logger . debug ( " Hello world! " ); // you can now use logger as usualJika Anda hanya membutuhkan pernyataan debug sederhana dan Anda tidak khawatir tentang kinerja, Anda dapat menggunakan fungsi yang lebih abstrak.
import hex . log . HexLog . * ; // Import all convenience functions
debug ( " Hello world " );
info ( " Hello world " );
warn ( " Hello world " );
error ( " Hello world " );
fatal ( " Hello world " );
// Gets replaced with:
// hex.log.LogManager.getLogger("my.current.class").debug("Hello world");
// ... etc // -- You can see this working in hex.log.ConfigurationTest.hx
// Create a new configuration
var configuration = new BasicConfiguration ();
// Create log targets
var traceTarget = new TraceLogTarget ( " Trace " , null , new DefaultTraceLogLayout ());
// Create a logger config and add targets
// (at this point we can also add filters to the configuration etc.)
var lc1 : LoggerConfig = LoggerConfig . createLogger ( " hex " , LogLevel . WARN , null , null ); // Logger will only forward warnings and higher
lc1 . addLogTarget ( traceTarget , LogLevel . ALL , null ); // Target will accept every event that arrives (in this case only warnings+ will be forwarded from the logger anyway)
configuration . addLogger ( lc1 . name , lc1 ); // Add logger config to the configuration
// Apply the configuration
LoggerContext . getContext (). setConfiguration ( configuration );
// Now you can request loggers and log as much you want and they will follow the rules set above
var logger = LogManager . getLogger ( " hex " );
logger . debug ( " test " ); // Fitered by config -> nothing will happen
logger . warn ( " test " ); // will be logged
var logger2 = LogManager . getLogger ( " hex.log " );
logger2 . debug ( " test " ); // Fitered by parent config -> nothing will happen
logger2 . warn ( " test " ); // will be logged
// NOTE: By default root logger is set to LogLevel.ERROR
var logger3 = LogManager . getLogger ( " something " );
logger3 . debug ( " test " ); // Filtered by root logger -> nothing will happen
logger3 . error ( " test " ); // will be logged